作者 : 不良使
潛力創作新星 華為雲享專家
博客記錄學習的思路,項目和錯誤,尋找志同道合的朋友
如果覺得有幫助記得一鍵三連 ┗|`O′|┛ 嗷~~
這篇文章是我對python裡面的靜態方法(staticmethod) 和 類方法(classmethod)的一些見解,希望能夠幫助到大家。在准備寫這篇文章之前我也是很迷茫,總是不理解,得過且過,能看懂代碼就行,反正又不常用,就沒放在心上。但是最近由於項目需要,滿屏的靜態方法和類方法屬實讓我有點迷茫,怎麼辦,想要繼續下去,那就只有學了。不逼自己一把,永遠不知道自己的潛力有多大。
一個比較簡單粗暴的區分方式:要決定是使用@staticmethod還是@classmethod,你必須看看類方法內部。如果你的方法訪問了類中的其他變量/方法,那麼就使用@classmethod。另一方面,如果方法沒有接觸到類中的任何其他變量,那麼就使用@staticmethod。
但是其設計有更深的邏輯聯系:
classmethod主要用於替代構造函數。
staticmethod不使用對象的狀態,甚至不使用類本身的結構。它可以是一個類外部的函數。它只放在類的內部,用於分組具有類似功能的函數(例如,像Java的數學類靜態方法)
@classmethod
Person.printAge = classmethod(Person.printAge)
@staticmethod
Calculator.add_numbers = staticmethod(Calculator.add_numbers)
能看懂這兩行代碼,應該就能理解什麼是靜態方法,什麼是類方法了吧。當然,看的不太懂也沒有關系,下面通過栗子來詳細的解說一下\
什麼是類方法?
類方法是綁定到類而不是其對象的方法。它不需要創建類實例,就像staticmethod 一樣。
靜態方法和類方法之間的區別在於:
靜態方法對類一無所知,只處理參數
類方法適用於類,因為它的參數始終是類本身。
類方法可以由類及其對象調用。
Class.classmethod()
Class().classmethod()
但無論如何,class方法始終附加到一個類,其中第一個參數作為類本身。cls
def classMethod(cls, args…)
代碼:
class Person:
age = 25
def printAge(cls):
print('The age is:', cls.age)
Person.printAge = classmethod(Person.printAge)
Person.printAge()
結果:
代碼:
class Person:
age = 25
@classmethod
def printAge(cls):
print('The age is:', cls.age)
Person.printAge()
結果:
你會發現改變了代碼,但是結果還是一樣的。你細心就會有所發現,沒錯,代碼中的
****@classmethod
等價於Person.printAge = classmethod(Person.printAge)
實例方法可以調用實例方法、類方法、靜態方法。類對象只能調用類方法、靜態方法。
classmethod與staticmethod用法類似,classmethod可以通過staticmethod代替,在通過類調用時,這兩者對於調用者來說是不可區分的。這兩者的區別在於,classmethod增加了一個對實際調用類的引用。
🥭🥭方法可以判斷出自己是通過基類被調用,還是通過某個子類被調用
🥭🥭通過子類調用時,方法可以返回子類的實例而非基類的實例
🥭🥭通過子類調用時,方法可以調用子類的其他classmethod
覺得有用的可以給個三連,關注一波!!!帶你了解更多的python小知識