staticmethod, classmethod 分別被稱爲靜態方法和類方法。
staticmethod
基本上和一個全局函數差很少,只不過能夠經過類或類的實例對象(python裏說光說對象老是容易產生混淆,
由於什麼都是對象,包括類,而實際上類實例對象纔是對應靜態語言中所謂對象的東西)來調用而已,
不會隱式地傳入任何參數。這個和靜態語言中的靜態方法比較像。
classmethod
是和一個class相關的方法,能夠經過類或類實例調用,並將該class對象(不是class的實例對象)隱式地
看成第一個參數傳入。就這種方法可能會比較奇怪一點,不過只要你搞清楚了python裏class也是個真實地
存在於內存中的對象,而不是靜態語言中只存在於編譯期間的類型,就好辦了。
正常的方法就是和一個類的實例對象相關的方法,經過類實例對象進行調用,並將該實例對象隱式地做爲第一個參數傳入,這個也和其它語言比較像。
區別:
類方法須要額外的類變量cls,當有之類繼承時,調用類方法傳入的類變量cls是子類,而不是父類。類方法和靜態方法均可以經過類對象和類的 實例對象訪問。
①靜態方法
>>> class Foo:
str = "I'm a static method."
def bar():
print Foo.str
bar = staticmethod(bar)
>>> Foo.bar()
I'm a static method.
②類方法
>>> class Foo:
str = "I'm a static method."
def bar(cls):
print cls.str
bar = classmethod(bar)
>>> Foo.bar()
I'm a static method.
上面的代碼咱們還能夠寫的更簡便些(python2.4+新語法):
①靜態方法
>>> class Foo:
str = "I'm a static method."
@staticmethod
def bar():
print Foo.str
>>> Foo.bar()
I'm a static method.
②類方法
>>> class Foo:
str = "I'm a static method."
@classmethod
def bar(cls):
print cls.str
>>> Foo.bar()
I'm a static method.