@staticmethod和@classmethod的做用與區別

通常來講,要使用某個類的方法,須要先實例化一個對象再調用方法。html

而使用@staticmethod或@classmethod,就能夠不須要實例化,直接類名.方法名()來調用。python

這有利於組織代碼,把某些應該屬於某個類的函數給放到那個類裏去,同時有利於命名空間的整潔。函數

既然@staticmethod和@classmethod均可以直接類名.方法名()來調用,那他們有什麼區別呢post

從它們的使用上來看,
  • @staticmethod不須要表示自身對象的self和自身類的cls參數,就跟使用函數同樣。
  • @classmethod也不須要self參數,但第一個參數須要是表示自身類的cls參數。

若是在@staticmethod中要調用到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。編碼

而@classmethod由於持有cls參數,能夠來調用類的屬性,類的方法,實例化對象等,避免硬編碼。spa

下面上代碼。htm

  1. class A(object):  
  2.     bar = 1  
  3.     def foo(self):  
  4.         print('foo')  
  5.  
  6.     @staticmethod  
  7.     def static_foo():  
  8.         print('static_foo')  
  9.         print(A.bar)
  10.  
  11.     @classmethod  
  12.     def class_foo(cls):  
  13.         print('class_foo')  
  14.         print(cls.bar)  
  15.         cls().foo()  
  16.   
  17. A.static_foo()  
  18. A.class_foo()  
輸出 static_foo 1 class_foo 1 foo
相關文章
相關標籤/搜索