天天看點

python3 classmethod 與 staticmethod的差別差別

classmethod 與staticmethod差別

  • 差別
  • 某個函數前面加上了staticmethod或者classmethod的話,那麼這個函數就可以不通過執行個體化直接調用。
  • 什麼意思呢?就是說有時候,我們需要把一些具有特定功能的函數放到一起,做成包導入Python程式,最好就是把他們放到一個類中,但是一個類每次我都要去執行個體化他,我覺得很麻煩,于是我在函數前面加上了@staticmethod,@classmethod,那麼我下次用這個函數的功能的時候,可以直接用 類名.函數名的形式了。

差別

  • @staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
  • @classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。
  • 如果在@staticmethod中要調用到這個類的一些屬性方法,隻能直接類名.屬性名或類名.方法名。
  • 而@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,執行個體化對象等,避免寫死。

簡單來說,就是staticmethod不需要傳入表示自身對象參數,而classmethod需要傳入一個類似于self的cls參數。那麼既然classmethod麻煩一點,必然有他麻煩的道理,就是:使用classmethod的話,凡是在該類中的類的屬性,方法,執行個體化對象等,都可以調用出來。

class A(object):
    bar = 1
    def foo(self):
        print('foo')
    
    @staticmethod
    def static_foo():
        print('static foo')
        print(A.bar)
        A().foo()   #隻能通過類名,函數名進行調用
        
    @classmethod
    def class_foo(cls):
        print('class_foo')
        print(cls.bar)
        cls().foo() #傳入了cls參數,可以調用類的屬性,方法,函數
    
#面試題: 都不需要執行個體化
A.static_foo()
A.class_foo()