Python-静态方法和类方法之间的区别
用@staticmethod
修饰的功能和用修饰的功能有什么区别@classmethod
?
回答:
也许有点示例代码将有助于:发现其中的差别在调用签名foo
,class_foo
并且static_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)
使用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)
静态方法用于对与类之间具有某种逻辑联系的函数进行分组。
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'>>
在这里,使用静态方法,即使它是一种方法,也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>
以上是 Python-静态方法和类方法之间的区别 的全部内容, 来源链接: utcz.com/qa/421634.html