第7.15節 Python中classmethod定義的類方法詳解
類中的方法,除了實例方法外,還有兩種方法,分別是類方法和靜態方法。本節介紹類方法的定義和使用。
一、 類方法的定義
在類中定義的方法,默認是實例方法,要定義類方法,需要用到單獨的語法。
1. 語法:
@classmethod
def 方法名(cls,其他參數):
方法體
2. 定義說明:
1) 上述語法定義中,@classmethod稱為類方法裝飾器,凡是類方法定義都必須有該裝飾器。
裝飾器是Python中一個重要概念,本質上是一個對函數進行轉換的函數,以@符號開頭,后面是一個函數名。關於裝飾器涉及比較多的知識,在本節暫不展開介紹,后面章節專門介紹,大家只要知道定義類方法需要使用@classmethod就行了。
2) 參數中的cls代表類自身,與實例方法中的self是相同的機制,也可以是任意的名字,類方法定義時第一個形參必須是cls,所有關於類屬性的訪問在類方法內都必須通過cls或類名進行方法。
二、 類方法的使用
類方法用在與單個實例無關但與類或類的所有實例相關的訪問場景,具體使用的方式如下:
1. 類方法可以在所有類方法中通過“類名.方法名”方式調用;
2. 類方法可以在類方法中通過“cls.方法名”方式調用,cls的來源請見上面類方法定義的說明;
3. 類方法可以在實例方法中通過“類名.方法名”方式調用;
4. 類方法可以在實例方法中通過“self.方法名”或“self.__class__.方法名”方式調用;
1) 這種方式當類名可能修改時比直接用類名調用方便;
2) 該訪問方式可以用在構造方法等實例方法中,但“self.__class__.方法名”不能用在重寫的__new__方法中。
a) 關於__ new__方法,相關內容在此不仔細介紹,大家可以到網上查一下資料,后面老猿將考慮單獨介紹,需要說明的是這也是一個實例定義時執行的方法,它在構造方法之前執行,一般不要重寫該方法;
b) “self.__class__.方法名”不能用在重寫的__new__方法中是因為此時實例還沒創建完成,不能正確的獲取到self.__class__的值(此時self.__class__的值為<class 'type'>),而類方法與實例無關,因此“self.方法名”可以訪問。
5. 類方法可以在類定義外的調用方代碼中通過“類名.方法名”方式調用;
6. 類方法可以在類定義外的調用方代碼中通過“實例名.方法名”方式調用,此時實參也無需傳遞cls;
7. 類方法可以在類定義外的調用方代碼中通過“實例名. __class__.方法名”方式調用,這種方式有點畫蛇添足,只是在此說明一種訪問方法,並不推薦使用。
注意類方法不能在類體代碼中調用:
1. 不能在類體中直接調用類方法時,這個時候類還未定義完,執行時會認為類未定義,會報類對象不可調用;
2. 當實例方法和類方法重名時,在類體代碼中后出現的方法會覆蓋前面的方法,其實在Python中,同一名字空間的同名函數(不管參數是否數目相同)都會被后定義的覆蓋,Python不支持一個函數不同變量的情況。由於類方法和實例方法都在類的空間內,因此二者不能重名。
本節詳細介紹了類方法的定義和使用方法,注意類方法定義必須使用裝飾器,方法中第一個形參為cls,通過“類名.方法名”的調用處不用傳遞實參cls,而是由Python代填。類方法的具體案例請見下節的案例介紹。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用於逐步介紹老猿學習Python后總結的學習經驗,這些經驗有助於沒有接觸過Python的程序員可以很容易地進入Python的世界。
歡迎大家批評指正,謝謝大家關注!