實際上,Python 完全支援定義類方法,甚至支援定義靜態方法。Python 的類方法和靜態方法很相似,它們都推薦使用類來呼叫(其實也可使用物件來呼叫)。
類方法和靜態方法的區別在於,Python會自動系結類方法的第一個引數,類方法的第一個引數(通常建議引數名為 cls)會自動系結到類本身;但對於靜態方法則不會自動系結。
使用 @classmethod 修飾的方法就是類方法;使用 @staticmethod 修飾的方法就是靜態方法。
下面程式碼示範了定義類方法和靜態方法:
class Bird:
# classmethod修飾的方法是類方法
@classmethod
def fly (cls):
print('類方法fly: ', cls)
# staticmethod修飾的方法是靜態方法
@staticmethod
def info (p):
print('靜態方法info: ', p)
# 呼叫類方法,Bird類會自動系結到第一個引數
Bird.fly() #①
# 呼叫靜態方法,不會自動系結,因此程式必須手動系結第一個引數
Bird.info('crazyit')
# 建立Bird物件
b = Bird()
# 使用物件呼叫fly()類方法,其實依然還是使用類呼叫,
# 因此第一個引數依然被自動系結到Bird類
b.fly() #②
# 使用物件呼叫info()靜態方法,其實依然還是使用類呼叫,
# 因此程式必須為第一個引數執行系結
b.info('fkit')
從上面粗體字程式碼可以看出,使用 @classmethod 修飾的方法是類方法,該類方法定義了一個 cls 引數,該引數會被自動系結到 Bird 類本身,不管程式是使用類還是物件呼叫該方法,Python 始終都會將類方法的第一個引數系結到類本身,如 ① 號、② 號程式碼的執行效果。
上面程式還使用 @staticmethod 定義了一個靜態方法,程式同樣既可使用類呼叫靜態方法,也可使用物件呼叫靜態方法,不管用哪種方式呼叫,Python 都不會為靜態方法執行自動系結。
在使用 Python 程式設計時,一般不需要使用類方法或靜態方法,程式完全可以使用函數來代替類方法或靜態方法。但是在特殊的場景(比如使用工廠模式)下,類方法或靜態方法也是不錯的選擇。