1. 程式人生 > 實用技巧 >python面向物件(五、類屬性、類方法、)

python面向物件(五、類屬性、類方法、)

6.類屬性和類方法

6.1 類的結構
6.1.1 例項
1)建立物件步驟:
(1)使用面相物件開發,第 1 步是設計類
(2)使用類名()建立物件,建立物件的動作有兩步:
在記憶體中為物件分配空間
呼叫初始化方法“init”為物件初始化
(3)物件建立後,記憶體中就有了一個物件的實實在在的存在——例項

2)定義:
(1)創建出來的物件叫做類的例項
(2)建立物件的動作叫做例項化
(3)物件的屬性叫做例項屬性
(4)物件呼叫的方法叫做例項方法

3)程式執行:
(1)物件各自擁有自己的例項屬性
(2)呼叫物件方法,可以通過self.
訪問自己的屬性
呼叫自己的方法

4)結論:
(1)每一個物件都有自己獨立的記憶體空間,儲存各自不同的屬性
(2)多個物件的方法,在記憶體中只有一份,在呼叫方法時,需要把物件的引用傳遞到方法內部

6.1.2 類是一個特殊的物件
Python中一切皆物件:
class AAA:AAA屬於類物件
obj1 = AAA():obj1屬於例項物件
在程式執行時,類同樣會被載入到記憶體
在Python中,類是一個特殊的物件——類物件
在程式執行時,類物件在記憶體中只有一份,使用一個類可以創建出很多個物件例項
除了封裝例項的屬性和方法外,類物件還可以擁有自己的屬性和方法:
類屬性
類方法
通過“類名.”的方式可以訪問類的屬性或者呼叫類的方法

6.2 類屬性和例項屬性
6.2.1 概念和使用
類屬性就是給類物件中定義的屬性
通常用來記錄與這個類相關的特徵
類屬性不會用於記錄具體物件的特徵
1)需求:
定義一個工具類
每件工具都有自己的name
需要知道使用這個類,建立了多少個工具物件?

2)程式碼:

程式開始執行程式時,會載入類,會執行類中所有程式碼。

6.2.2 屬性的獲取機制(科普)
在Python中屬性的獲取存在一個向上查詢機制


因此,要訪問類屬性有兩種方式:
1)類名.類屬性
2)物件.類屬性 (不推薦)
注意:
如果使用“物件.類屬性=值”賦值語句,只會給物件新增一個屬性,而不會影響到類屬性的值

6.3 類方法和靜態方法
6.3.1 類方法
類屬性就是針對類物件定義的屬性
使用賦值語句在class關鍵字下方可以定義類屬性,類屬性用於記錄與這個類相關的特徵
類方法就是針對類物件定義的方法
在類方法內部可以直接訪問類屬性或者呼叫其他的類方法
語法如下:
@classmethod def 類方法名(cls): pass


1)概念
(1)類方法需要用修飾器“@classmethod”來標識,告訴直譯器這是一個類方法
(2)類方法的第一個引數應該是cls
由哪一個類呼叫的方法,方法內的cls就是哪一個類的引用
這個引數和例項方法的第一個引數是self類似
提示:使用其他名稱也可以,不過習慣使用cls
(3)通過“類名.”呼叫類方法,呼叫方法時,不需要傳遞cls引數
(4)在方法內部:
可以通過cls.訪問類的屬性
也可以通過cls.呼叫其他的類方法

2)示例
需求:
(1)定義一個工具類
(2)每件工具都有自己的name
(3)在類封裝一個show_tool_count的類方法,輸出使用當前這個類,建立的物件個數

3)程式碼

在類方法內部,可以直接使用“cls.”訪問類屬性或者呼叫類方法

6.3.2 靜態方法
在開發時,如果需要在類中封裝一個方法,這個方法既不需要訪問例項屬性或者呼叫例項方法,也不需要訪問類屬性或者呼叫類方法。
這個時候,可以把這個方法封裝成一個靜態方法
語法如下:
@staticmethod def 靜態方法名(): pass
靜態方法名後面的“()”中,不需要self(物件方法),也不需要cls(類方法),直接輸入形參即可。
靜態方法需要用修飾器“@staticmethod”來標識,告訴直譯器這是一個靜態方法
通過“類名.”呼叫靜態方法,不需要建立物件

6.3.3 方法綜合案例
1)需求
(1)設計一個Game類
(2)屬性:
定義一個類屬性top_score記錄遊戲的歷史最高分
定義一個例項屬性player_name記錄當前遊戲的玩家姓名
(3)方法:
靜態方法show_help顯示遊戲幫助資訊
類方法show_top_score顯示歷史最高分
例項方法start_game開始當前玩家的遊戲
(4)主程式步驟
檢視幫助資訊
檢視歷史最高分
建立遊戲物件,開始遊戲

2)程式碼


3)案例小結
(1)例項方法:方法內部需要訪問例項屬性
例項方法內部可以使用“類名.”訪問類屬性
(2)類方法:方法內部只需要訪問類屬性
(3)靜態方法:方法內部,不需要訪問例項屬性和類屬性
如果方法內部即需要訪問例項屬性,又需要訪問類屬性,應該定義例項方法。因為,類只有一個,在例項方法內部可以使用類名.訪問類屬性

6.4 類的成員
6.4.1 變數
1)例項變數 -> 物件屬性 -> 使用“物件.”訪問
2)類變數 -> 類屬性-> 使用“類名.”訪問

6.4.2 方法
1)例項方法 -> 物件方法 -> 第一個引數寫“self”,使用“物件.”訪問
2)類方法 -> 第一個引數寫“cls”,用 “@classmethod”來標識,使用“類名.”訪問
3)靜態方法 ->用“@staticmethod”來標識,使用“類名.”訪問

6.4.3 property裝飾器
使用“@property”來標識,可以將方法裝飾成屬性。類似其它語言中的getter

被“@property”裝飾的屬性,每次獲取資料時都是實時計算的。如果寫到初始化方法中,只會在Person類初始化時,計算一次。
被“@property”裝飾的屬性,只能取值,不能賦值
可以使用“@property”裝飾讀取私有屬性

6.4.4 setter裝飾器
setter裝飾器允許你對已用@property裝飾的屬性(函式)賦值

6.5 類與類之間的關係(重點)
6.5.1 依賴關係(鬆散)
依賴關係:執行某個動作的時候,呼叫其它類來完成這個操作。
依賴關係中類與類之間的關係是最鬆散的.

執行結果:

6.5.2 關聯關係(組合、聚合)
關聯關係:把另一個類的物件作為當前這個類的一個屬性
物件裡面包含物件:物件.物件
1)關聯關係一對一

執行結果:


執行結果:

2)關聯關係一對多(使用最多)

執行結果:

一個人可以有多個訂單
一個訂單內可以有多個商品
一個領導多個員工

6.5.3 繼承關係,實現關係(緊密)

6.6 方法和函式(瞭解)
6.6.1 函式: 函式不需要繫結物件

6.6.2 例項方法:
1)物件.方法 -> 方法
2)類名.方法 -> 函式

6.6.3 類方法:
不論如何呼叫都是方法,因為類也是物件,Python中萬物皆物件

類物件的屬性:類變數
類物件的功能:類方法
type是所有類的根,類是由type建立的

6.6.4 靜態方法
不論如何呼叫都是函式

6.6.5 判斷函式和方法:FunctionType, MethodType