@classmethod:当类中的方法只使用类中的资源,即方法中不需要用到self来传递信息,那么可以将这个方法装饰成类方法,这样的方法里的默认参数会变成cls,cls用来传递当前的类,self用来传递当前类的实例。这样子可以直接用类名操作类中的私有属性。
@staticmethod:当一个程序只允许用面向对象编程时,所有的函数都要写在类里,这种普通函数,没有用到类命名空间和对象命名空间的信息的函数,可以用@static method进行伪装,就不会传入self或cls默认参数。
class A(object): def foo(self): print(self) #<__main__.A object at 0x0000018A541E1A58> @classmethod def class_foo(cls): print(cls) # <class '__main__.A'> print(A) # <class '__main__.A'> def static_foo(x): print(x) a = A() a.foo() A.class_foo() A.static_foo(1) # 1