python3 classmethod 与 staticmethod的区别

classmethod 与staticmethod区别

  • 某个函数前面加上了staticmethod或者classmethod的话,那么这个函数就可以不通过实例化直接调用。
  • 什么意思呢?就是说有时候,我们需要把一些具有特定功能的函数放到一起,做成包导入Python程序,最好就是把他们放到一个类中,但是一个类每次我都要去实例化他,我觉得很麻烦,于是我在函数前面加上了@staticmethod,@classmethod,那么我下次用这个函数的功能的时候,可以直接用 类名.函数名的形式了。

区别

  • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
  • 如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
  • 而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

简单来说,就是staticmethod不需要传入表示自身对象参数,而classmethod需要传入一个类似于self的cls参数。那么既然classmethod麻烦一点,必然有他麻烦的道理,就是:使用classmethod的话,凡是在该类中的类的属性,方法,实例化对象等,都可以调用出来。

class A(object):
    bar = 1
    def foo(self):
        print('foo')
    
    @staticmethod
    def static_foo():
        print('static foo')
        print(A.bar)
        A().foo()   #只能通过类名,函数名进行调用
        
    @classmethod
    def class_foo(cls):
        print('class_foo')
        print(cls.bar)
        cls().foo() #传入了cls参数,可以调用类的属性,方法,函数
    
#面试题: 都不需要实例化
A.static_foo()
A.class_foo()
上一篇:Java中静态方法能否被重写


下一篇:如何通过Makefile编译iphone的openSSL