问题

  最佳答案

也许一点示例代码会有帮助:注意foo,class_foostatic_foo的调用签名的区别:

 class A(object):
    def foo(self, x):
        print "executing foo(%s, %s)" % (self, x)

    @classmethod
    def class_foo(cls, x):
        print "executing class_foo(%s, %s)" % (cls, x)

    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)" % x    

a = A()
 

下面是对象实例调用方法的通常方式.对象实例 a 被隐式传递为第一个参数。

 a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
 

使用类方法,对象实例的类被隐式传递为第一个参数,而不是self

 a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
 

您也可以使用类调用 class_foo。 一个类方法,可能是因为您打算从类而不是从类实例调用它. A.foo(1)会引发TypeError,但A.class_foo(1)工作正常:

 A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
 

人们为类方法找到的一个用途是创建可继承的替代构造函数.


使用staticmethods,self(对象实例)和cls(类)都不被默示传递为第一个参数.它们的行为像普通函数,除非您可以从实例或类调用它们:

 a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)
 

Staticmethods用于对与类有某种逻辑联系的函数进行组合。


foo只是一个函数,但是当你调用a.foo时,你不只是得到函数, 您得到一个函数的“部分应用”版本,对象实例a绑定为函数的第一个参数. foo期望2个参数,而a.foo只期望1个参数.

a绑定到foo.这是下面“绑定”一词的意思:

 print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
 

使用a.class_foo,a不绑定到class_foo,而类A绑定到class_foo.

 print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
 

在这里,使用static方法,即使它是一个方法,a.static_foo只返回 一个好的“ole函数,没有参数绑定. static_foo期望1个参数, a.static_foo也期望1个参数.

 print(a.static_foo)
# <function static_foo at 0xb7d479cc>
 

当然,当您使用类A调用static_foo时也会发生同样的情况。

 print(A.static_foo)
# <function static_foo at 0xb7d479cc>
 

  相同标签的其他问题

pythonoopmethodspython-decorators