你的猜测是正确的 – 你明白classmethods是如何工作的。
为什么这些方法可以在类的实例OR上调用(在这两种情况下,类对象都将作为第一个参数传递):
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
print cls
#both of these will have exactly the same effect
Dummy.some_function()
Dummy().some_function()
关于在实例上使用这些:在实例上调用类方法至少有两个主要用途:
> self.some_function()将调用some_function的实际类型的自我,而不是调用恰好出现的类(如果类被重命名,则不需要注意);和
>在some_function是实现一些协议所必需的情况下,但是对于单独调用类对象是有用的。
与staticmethod的区别:还有另一种方法来定义不访问实例数据的方法,称为staticmethod。这创建一个不接收隐式第一个参数的方法;因此它不会传递任何关于它被调用的实例或类的信息。
In [6]: class Foo(object): some_static = staticmethod(lambda x: x+1)
In [7]: Foo.some_static(1)
Out[7]: 2
In [8]: Foo().some_static(1)
Out[8]: 2
In [9]: class Bar(Foo): some_static = staticmethod(lambda x: x*2)
In [10]: Bar.some_static(1)
Out[10]: 2
In [11]: Bar().some_static(1)
Out[11]: 2
我发现它的主要用途是适应现有的函数(不期望接收一个self)是一个类(或对象)上的方法。