類方法是從屬於"類物件"的方法。類物件可以通過裝飾器@classmethod
來定義,具體格式如下:
@classmethod
def 類方法名(cls [
, 形參列表]):
方法體
要點如下:
@classmethod
必須位於方法的上面一行
第乙個引數cls(class的縮寫,和前面筆記介紹的self類似),必須要有,代指"類物件"本身。
呼叫類方法格式:類名.類方法名(引數列表)
。引數列表中不需要也不能給cls引數進行傳值,直譯器會自動賦值。
類方法中可以訪問例項屬性和例項方法會導致錯誤,因為有類不一定有物件。
子類繼承父類方法時,傳入cls是自身物件,而非父類物件。(後面的筆記會有介紹)
**示例:
class
student
: count =
0# 類屬性
"""定義方法"""
@classmethod
defprint_count
(cls)
:"""cls引數代表類物件"""
print
(student.count)
"""呼叫類方法"""
print
("呼叫時,不傳遞cls引數"
)student.print_count(
)
執行結果:
呼叫時,不傳遞cls引數
0
在python中,允許定義於」類物件「無關的方法,稱為"靜態方法"。
「靜態方法"和在模組中定義的普通方法沒有什麼區別,只不過"靜態方法"放到了"類的名字變數空間」,需要通過類呼叫。
靜態方法通過裝飾器@staticmethod
來定義,格式如下:
@staticmethod
def 靜態方法名(
[形參列表]):
方法體
要點如下:
@staticmethod
必須位於方法上面一行
呼叫靜態方法格式:類名.靜態方法名(引數列表)
靜態方法中訪問例項屬性和例項方法會導致錯誤
**示例:
class
student
: count =
0# 類屬性
@staticmethod
defadd
(a, b)
:"""與類無關的靜態方法"""
"""因為靜態方法從屬於類,所以是可以操作類屬性和類方法"""
print
("+="
.format
(a, b, a+b)
)return a + b
# 呼叫靜態方法
student.add(20,
30)
執行結果:
20+30
=50res=
50
class
myclass
:# 類屬性
class_attr =
0def
__init__
(self, obj_attr)
: self.obj_attr = obj_attr
definstance_method
(self)
:return
"instance method called"
, self
@classmethod
defclass_method
(cls)
:return
"class method called"
, cls
@staticmethod
defstatic_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基礎 09 物件導向
1.基本格式和使用 類 class 類名 塊物件 物件名 類名 2.組成 2.屬性 特徵 例項屬性 修改 類外面 例項物件.屬性名 值 類裡面 self.屬性名 值 獲取 類外面 物件名.屬性名 類裡面 self.屬性名 類屬性 歸屬於類物件的屬性,所有物件共有的屬性 類屬性只能通過類物件修改,不能...
Python 基礎 09 物件導向2
繼承 子類繼承父類,子類一旦繼承父類,就擁有父類中非私有的屬性和方法 繼承的格式 class 子類名 父類名 子類中的 繼承的優點 1.避免了 的重複,提高了 的重複使用率 2.擴充套件了子類的功能 class obj 1 def init self,func1,func2 self.func1 f...
036 物件導向 09
一 概念部分 靜態變數 在類中,用static宣告的成員變數為靜態變數 也叫類變數 類屬性 二 靜態變數的特點 1.它為該類的公用變數,屬於類,被該類的所有例項共享,在類被載入時被顯式初始化 2.對於該類的所有物件來說,static成員變數只有乙份。被該類的所有物件共享 3.可以使用 物件.類屬性 ...