首先,这是一个经典的问题。
我们首先做一个比较:
classmethod的第一个参数是cls,即调用的时候要把类传入
这意味着我们我们可以在classmethod里使用类的属性,而不是类的实例的属性(显式创建可用)
staticmethod,调用的时候没有参数,即调用的时候我们不传入东西(类,类的实例)
这意味着我们在staticmethod里无法得到类的实例(显式创建可用)
而我们调用类的普通方法的时候,要把self传进去
这意味着在这个普通方法里,我们只能使用类的实例(self)的属性方法
至于怎么调用呢?看下面:
class A(object): bar = 1 def foo(self): print ‘foo‘ @staticmethod def static_foo(): print ‘static_foo‘ print A.bar # static_foo位于class A中,A相当于全局的,所以能访问到A的属性 A().foo() # static_foo位于class A中,A相当于全局的,所以能访问到A的方法
@classmethod def class_foo(cls): print ‘class_foo‘ print cls.bar # 等于调用 A.bar cls().foo() # 等于调用 A().foo() A.static_foo() A.class_foo()
输出:
static_foo, 1,foo
class_foo,1,foo
一目了然