不說(shuō)廢話直接Show me the code,整理來(lái)源:http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-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()
先看看常規(guī)調(diào)用方法時(shí)打印出self,發(fā)現(xiàn)是一個(gè)指向內(nèi)存的對(duì)象
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
With classmethods, 打印顯示的是A的class類型
a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
我們也可以通過(guò)A.class_foo()來(lái)直接調(diào)用類方法,但是通過(guò)A.foo()這樣的調(diào)用會(huì)引起TypeError.
A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
classmethods 的一種使用方式是利用描述符的功能去實(shí)現(xiàn)可繼承可變的構(gòu)造函數(shù) inheritable alternative constructors.
With static methods, 既不需要class參數(shù)也不需要self,可以通過(guò)以下兩種方式進(jìn)行調(diào)用
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
foo只是一個(gè)方法, 但是調(diào)用a.foo 的時(shí)候不是僅僅的得到了這個(gè)方法,我們得到了這個(gè)對(duì)象 a 的foo方法的"partially applied" ,對(duì)象a默認(rèn)綁定到這個(gè)方法的第一個(gè)參數(shù) ,方法foo 指定了兩個(gè)參數(shù),但是 a.foo實(shí)際只需要開(kāi)發(fā)者傳入一個(gè)參數(shù). 我們來(lái)對(duì)方法進(jìn)行打印來(lái)進(jìn)一步看看里面的奧妙.
對(duì)象a是綁定到foo()這個(gè)方法上的:
print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
我們接下來(lái)調(diào)用a.class_foo, 發(fā)現(xiàn)對(duì)象a 不是綁定到class_foo這個(gè)方法上,而是類A綁定到方法class_foo上.
print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
staticmethod 就更直接,什么也不綁定
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
通過(guò)類調(diào)用也是一樣的.
print(A.static_foo)
# <function static_foo at 0xb7d479cc>