Python 静态方法和类方法的区别


Python 静态方法和类方法的区别

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)

对于classmethods,对象实例的类隐式传递为第一个参数而不是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)

Staticmethod用于将与类有逻辑连接的函数分组到类中。

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_fooa不是必然的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>

当然,当您static_foo与班级打电话时会发生同样的事情A。

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