[Python 基礎] Python 例項方法、靜態方法和類方法詳解 (包含區別和用法)

大海發表於2020-06-24
Python 例項方法、靜態方法和類方法詳解 (包含區別和用法)
  • 和類屬性一樣,類方法也可以進行更細緻的劃分,具體可分為類方法、例項方法和靜態方法。
  • 和類屬性的分類不同,對於初學者來說,區分這 3 種類方法是非常簡單的,即採用 @classmethod 修飾的方法為類方法;採用 @staticmethod 修飾的方法為靜態方法;不用任何修改的方法為例項方法。
  • 其中 @classmethod@staticmethod 都是函式裝飾器。
Python 類例項方法

通常情況下,在類中定義的方法預設都是例項方法。

比如下面的類中就用到了例項方法
class CLanguage:
    #類構造方法,也屬於例項方法
    def __init__(self):
        self.name = "C語言中文網"
        self.add = "http://c.biancheng.net"
    # 下面定義了一個say例項方法
    def say(self):
        print("正在呼叫 say() 例項方法")
例項方法最大的特點就是它最少也要包含一個 self 引數用於繫結呼叫此方法的例項物件Python 會自動完成繫結)。例項方法通常會用類物件直接呼叫例如
clang = CLanguage()
clang.say()
執行結果
正在呼叫 say() 例項方法

當然Python 也支援使用類名呼叫例項方法但此方式需要手動給 self 引數傳值例如
#類名呼叫例項方法,需手動給 self 引數傳值
clang = CLanguage()
CLanguage.say(clang)
執行結果為
正在呼叫 say() 例項方法

Python 類方法

Python 類方法和例項方法相似,它最少也要包含一個引數,只不過類方法中通常將其命名為 cls,Python 會自動將類本身繫結給 cls 引數(注意,繫結的不是類物件)。也就是說,我們在呼叫類方法時,無需顯式為 cls 引數傳參。
和 self 一樣,cls 引數的命名也不是規定的(可以隨意命名),只是 Python 程式設計師約定俗稱的習慣而已。

和例項方法最大的不同在於類方法需要使用classmethod修飾符進行修飾例如
class CLanguage:
    #類構造方法,也屬於例項方法
    def __init__(self):
        self.name = "C語言中文網"
        self.add = "http://c.biancheng.net"
    #下面定義了一個類方法
    @classmethod
    def info(cls):
        print("正在呼叫類方法",cls)
注意如果沒有 classmethod Python 直譯器會將 fly() 方法認定為例項方法而不是類方法

類方法推薦使用類名直接呼叫當然也可以使用例項物件來呼叫不推薦)。例如在上面 CLanguage 類的基礎上在該類外部新增如下程式碼
#使用類名直接呼叫類方法
CLanguage.info()
#使用類物件呼叫類方法
clang = CLanguage()
clang.info()
執行結果為
正在呼叫類方法
正在呼叫類方法

Python 類靜態方法

靜態方法,其實就是我們學過的函式,和函式唯一的區別是,靜態方法定義在類這個空間(類名稱空間)中,而函式則定義在程式所在的空間(全域性名稱空間)中。

靜態方法沒有類似 selfcls 這樣的特殊引數因此 Python 直譯器不會對它包含的引數做任何類或物件的繫結也正因為如此類的靜態方法中無法呼叫任何類屬性和類方法
靜態方法需要使用staticmethod修飾例如
class CLanguage:
    @staticmethod
    def info(name,add):
        print(name,add)
靜態方法的呼叫既可以使用類名也可以使用類物件例如
#使用類名直接呼叫靜態方法
CLanguage.info("C語言中文網","http://c.biancheng.net")
#使用類物件呼叫靜態方法
clang = CLanguage()
clang.info("Python教程","http://c.biancheng.net/python")
執行結果為
C語言中文網 http://c.biancheng.net
Python教程 http://c.biancheng.net/python

在實際程式設計中,幾乎不會用到類方法和靜態方法,因為我們完全可以使用函式代替它們實現想要的功能,但在一些特殊的場景中(例如工廠模式中),使用類方法和靜態方法也是很不錯的選擇。

相關文章