淺談python 類方法/靜態方法
阿新 • • 發佈:2020-09-21
1.類方法
類方法是從屬於"類物件"的方法。類物件可以通過裝飾器@classmethod來定義,具體格式如下:
@classmethod def 類方法名(cls [,形參列表]): 方法體
要點如下:
- @classmethod必須位於方法的上面一行
- 第一個引數cls(class的縮寫,和前面筆記介紹的self類似),必須要有,代指"類物件"本身。
- 呼叫類方法格式:類名.類方法名(引數列表)。引數列表中不需要也不能給cls引數進行傳值,直譯器會自動賦值。
- 類方法中可以訪問例項屬性和例項方法會導致錯誤,因為有類不一定有物件。
- 子類繼承父類方法時,傳入cls是自身物件,而非父類物件。(後面的筆記會有介紹)
程式碼示例:
class Student: count = 0 # 類屬性 """定義方法""" @classmethod def print_count(cls): """cls引數代表類物件""" print(Student.count) """呼叫類方法""" print("呼叫時,不傳遞cls引數") Student.print_count()
執行結果:
呼叫時,不傳遞cls引數
0
2.靜態方法
在python中,允許定義於”類物件“無關的方法,稱為"靜態方法"。
"靜態方法"和在模組中定義的普通方法沒有什麼區別,只不過"靜態方法"放到了"類的名字變數空間",需要通過類呼叫。
@staticmethod def 靜態方法名([形參列表]): 方法體
要點如下:
- @staticmethod必須位於方法上面一行
- 呼叫靜態方法格式:類名.靜態方法名(引數列表)
- 靜態方法中訪問例項屬性和例項方法會導致錯誤
程式碼示例:
class Student: count = 0 # 類屬性 @staticmethod def add(a,b): """與類無關的靜態方法""" """因為靜態方法從屬於類,所以是可以操作類屬性和類方法""" print("{0}+{1}={2}".format(a,b,a+b)) return a + b # 呼叫靜態方法 Student.add(20,30)
執行結果:
20+30=50
res=50
3.例項方法/類方法/靜態方法的區別
class MyClass: # 類屬性 class_attr = 0 def __init__(self,obj_attr): self.obj_attr = obj_attr def instance_method(self): return "instance method called",self @classmethod def class_method(cls): return "class method called",cls @staticmethod def static_method(): return "static method called" print("呼叫例項方法") obj1 = MyClass("obj_attr1") print(obj1.instance_method()) print("--" * 20) print("呼叫類方法") print(MyClass.class_method()) print("--" * 20) print("呼叫靜態方法") print(MyClass.static_method())
執行結果:
呼叫例項方法
('instance method called',<__main__.MyClass object at 0x10ca93310>)
----------------------------------------
呼叫類方法
('class method called',<class '__main__.MyClass'>)
----------------------------------------
呼叫靜態方法
static method called
注意: 以下討論的屬性、方法均指公開的型別,非私有的。
例項方法:
- 能讀取、修改例項屬性
- 能呼叫例項方法
- 能讀取、修改類屬性
- 能呼叫類方法
- 能呼叫類靜態方法
- 呼叫方式:物件名.例項方法名(引數列表),編譯器自動傳遞self引數
類方法:
- 不能讀取、修改例項屬性
- 不能用例項方法
- 能讀取、修改類屬性
- 能呼叫類方法
- 能呼叫類靜態方法
- 呼叫方式:類名.類方法名(引數列表),編譯器自動傳遞cls引數
靜態方法:
- 不能讀取、修改例項屬性
- 不能用例項方法
- 能讀取、修改類屬性
- 能呼叫類方法
- 能呼叫類靜態方法
- 呼叫方式: 類名.靜態方法名(引數列表),不需要cls引數
- 類方法和靜態方法,功能非常相近,可以相互替代, 但是從規範的角度來說,請按照例項方法操作物件,類方法操作類,靜態方法為和類無關的通用方法。
以上就是淺談python 類方法/靜態方法的詳細內容,更多關於類方法/靜態方法的資料請關注我們其它相關文章!