[Python 基礎] Python 例項方法、靜態方法和類方法詳解 (包含區別和用法)
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類靜態方法
靜態方法,其實就是我們學過的函式,和函式唯一的區別是,靜態方法定義在類這個空間(類名稱空間)中,而函式則定義在程式所在的空間(全域性名稱空間)中。
靜態方法沒有類似 self、cls 這樣的特殊引數,因此 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
在實際程式設計中,幾乎不會用到類方法和靜態方法,因為我們完全可以使用函式代替它們實現想要的功能,但在一些特殊的場景中(例如工廠模式中),使用類方法和靜態方法也是很不錯的選擇。
相關文章
- Python 靜態方法和類方法的區別Python
- Python例項方法、類方法、靜態方法Python
- Python Class 的例項方法/類方法/靜態方法Python
- Python中類方法和例項方法有什麼區別?Python
- Python常見面試題006 類方法、類例項方法、靜態方法有何區別?Python面試題
- 靜態方法和例項方法的區別以及如何恰當使用
- javascript 靜態方法和例項方法例項JavaScript
- Python的靜態方法和類成員方法Python
- Python - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- 你真的瞭解靜態方法與例項方法的區別麼?
- js--Object的靜態方法和例項方法JSObject
- 初學Python過程中,例項方法和類方法的區別是什麼?Python
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- javascript的靜態方法和例項方法簡單介紹JavaScript
- vue 快速入門 系列 —— 例項方法(或 property)和靜態方法Vue
- 『無為則無心』Python物件導向 — 58、類方法和靜態方法Python物件
- Python的靜態方法和類成員方法都可以被類或例項訪問,兩者概念不容易理清,但還是有區別的Python
- python基礎(8)python中is和==的區別詳解Python
- 類的靜態屬性和方法
- 詳解Python物件導向程式設計之類、例項、方法Python物件程式設計
- Java開發筆記(六十四)靜態方法引用和例項方法引用Java筆記
- python建立類和類方法Python
- python入門基礎(14)--類的屬性、成員方法、靜態方法以及繼承、過載Python繼承
- Python生成器next方法和send方法區別Python
- 靜態變數和例項變數區別?變數
- Java靜態方法和例項方法 java中的陣列作為形參傳入Java陣列
- python繼承和重寫init方法--例項Python繼承
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- Python (類)例項方法的特殊屬性Python
- Python中函式和方法的區別Python函式
- JNI/NDK開發指南(6):C/C++訪問Java例項方法和靜態方法C++Java
- Python關於反射和類的特殊成員方法詳解Python反射
- python 類和例項Python
- 靜態方法和普通的成員方法||分配記憶體空間的區別記憶體
- js 物件方法、類方法、原型方法的區別;私有屬性、公有屬性、公有靜態屬性的區別JS物件原型
- [轉載] python複數型別-Python 複數屬性和方法操作例項Python型別
- Python中動態類和動態方法的建立與呼叫Python
- javaSE-day04--ArrayList基本用方法、類內定義方法和方法過載、靜態方法static(類的方法)、工具方法(static)的定義和使用Java