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()