今天在Stackoverflow上看見有人提問
What is the difference between @staticmethod and @classmethod in Python?
骂际。有個(gè)回答特別好速兔,在此做個(gè)筆記价淌。
問題源鏈接為:http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python
概念是枯燥的镇防,作者通過實(shí)例來解釋啦鸣,很好的說明了問題。一起來學(xué)習(xí)下:
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
if __name__ == '__main__':
a = A()
注意 foo营罢,class_foo和static_foo的調(diào)用簽名的區(qū)別
以下是對(duì)象實(shí)例調(diào)用方法的通常方式赏陵。 對(duì)象實(shí)例a作為第一個(gè)參數(shù)被隱式傳遞饼齿。
a.foo(1)
# executing foo(<__main__.A object at 0x7fe2c6e4e290>, 1)
對(duì)于類方法而言饲漾,對(duì)象實(shí)例所屬的類被隱式地作為第一個(gè)參數(shù)傳遞,而不是self
(對(duì)象實(shí)例)缕溉。
a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
你也可以直接使用類名調(diào)用class_foo
考传。事實(shí)上,如果你把一個(gè)方法定義成類方法证鸥,那可能是因?yàn)槟愦蛩銖念愔姓{(diào)用他而不是通過類的實(shí)例僚楞。A.foo(1)
將會(huì)拋出一個(gè)TypeError的錯(cuò)誤勤晚,但是A.class_foo(1)
會(huì)運(yùn)行的很好:
A.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
對(duì)于靜態(tài)方法而言,既不是self(對(duì)象實(shí)例)
,也不是cls(類本身)
作為第一個(gè)參數(shù)被隱式傳遞泉褐。它們的行為類似于純函數(shù)赐写。你可以通過類或者實(shí)例去調(diào)用他們。
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
靜態(tài)方法用于將具有與類的某些邏輯連接的函數(shù)分組到該類(或許這個(gè)方法與類的關(guān)系不大膜赃,但從邏輯上來說卻屬于這個(gè)類挺邀,把這樣的方法移動(dòng)到類中,也有利于代碼的組織)