Python靜態方法和類方法的區別和應用(無師自通)

2020-07-16 10:04:42
實際上,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 程式設計時,一般不需要使用類方法或靜態方法,程式完全可以使用函數來代替類方法或靜態方法。但是在特殊的場景(比如使用工廠模式)下,類方法或靜態方法也是不錯的選擇。