[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

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

相關文章