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