一般來說,要使用某個類的方法,需要先實例化一個對象再調用方法。而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。
這有利於組織代碼,把某些應該屬於某個類的函數給放到那個類裏去,同時有利於命名空間的整潔。
既然@staticmethod和@classmethod都可以直接類名.方法名()來調用,那他們有什麼區別呢從它們的使用上來看,
@staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
@classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。
如果在@staticmethod中要調用到這個類的一些屬性方法,只能直接“類名.屬性名“或“類名().方法名“。
而@classmethod因爲持有cls參數,可以來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
示例代碼如下:
A(): bar = (): (): A.bar A().foo() (): .bar A.bar ().foo() A().foo() A.static_foo() A.class_foo() |
輸入結果如下:
static_foo A.bar= 1 foo class_foo cls.bar= 1 A.bar= 1 foo foo |
轉自:http://blog.csdn.net/handsomekang/article/details/9615239