一、總體目錄
- 1.1、類的結構
- 1.2、類屬性和實例屬性
- 1.3、類方法和靜態方法
二、類的結構
-
2.1、術語 -實例
使用面相對象開發,第 1 步 是設計 類
-
使用 類名() 創建對象,創建對象 的動作有兩步:
(1) 在內存中為對象 分配空間
-
(2) 調用初始化方法
__init__
為 對象初始化
對象創建后,內存 中就有了一個對象的 實實在在 的存在 —實例
- 創建出來的
對象
叫做類 的 實例
- 創建對象的
動作
叫做實例化
- 對象的
屬性
叫做實例屬性
- 對象調用的
方法
叫做實例方法
- 創建出來的
-
在程序執行時
- 對象各自擁有自己的
實例屬性
- 調用對象方法,可以通過
self.
- 對象各自擁有自己的
結論
- 每一個對象 都有自己
獨立的內存空間
,保存各自不同的屬性 - 多個對象的方法,
在內存中只有一份
,在調用方法時,需要把對象的引用
傳遞到方法內部
-
2.2 類是一個特殊的對象
Python 中 一切皆對象:
- class AAA: 定義的類屬于 類對象
- obj1 = AAA() 屬于 實例對象
在程序運行時,
類
同樣會被加載到內存
在 Python 中,
類
是一個特殊的對象 ——類對象
在程序運行時,
類對象
在內存中只有一份
,使用一個類
可以創建出很多個對象實例
-
除了封裝
實例
的屬性
和方法
外,類對象
還可以擁有自己的屬性
和方法
- 類屬性
- 類方法
- 通過
類名.
的方式可以訪問類的屬性
或者調用類的方法
類的結構示意圖
三、類屬性 和 實例屬性
-
3.1 概念和使用
類屬性 就是給 類對象 中定義的 屬性
通常用來記錄 與這個類相關 的特征
類屬性 不會用于記錄 具體對象的特征
-
如下例子,定義一個 類屬性
count
,記錄創建類的個數class Tool(object): # 使用賦值語句,定義類屬性,記錄創建工具對象的總數 count = 0 def __init__(self,name): # 針對類屬性做一個計數+1 Tool.count += 1 self.name = name # 創建工具對象 tool1 = Tool("斧頭") tool2 = Tool("鐮刀") # 知道使用 Tool 類到底創建了多少個對象? print("工具的數量是 %d"%Tool.count)
類屬性的創建:在類的下面使用賦值語句,等號左邊是類屬性的名字,右邊是類屬性的初始值 ;使用是:
類名.屬性名
, 如上面的 count
-
3.2、屬性的獲取機制-
向上查找機制
-
在 Python 中 屬性的獲取 存在一個 向上查找機制(下面代碼 Tool.count 與 tool2.count)
class Tool(object): # 使用賦值語句,定義類屬性,記錄創建工具對象的總數 count = 0 def __init__(self,name): # 針對類屬性做一個計數+1 Tool.count += 1 self.name = name # 創建 工具對象 tool1 = Tool("斧頭") tool2 = Tool("鐮刀") # 知道使用 Tool 類到底創建了多少個對象? # print("工具的數量是 %d"%Tool.count) print("工具的數量是 %d"% tool2.count)
說明查找機制:首先上面的代碼
tool2.count
,tools這個對象是沒有count
這個屬性的,這時候就會去類的屬性里面去找有沒有count
,如果類里面也沒有的話就報錯-
由上面可知,要訪問類屬性有兩種方式:
- 類名.類屬性
- 對象.類屬性 (不推薦)
-
注意:如果使用
對象.類屬性 = 值
賦值語句,只會給對象添加一個屬性
,而不會影響到類屬性的值
如上面的代碼修改后(
tool2.count
就不靠譜了,僅僅是為 tool2添加了一個屬性而已)# 創建 工具對象 tool1 = Tool("斧頭") tool2 = Tool("鐮刀") # 知道使用 Tool 類到底創建了多少個對象? print("工具的數量是 %d"%Tool.count) tool2.count = 100 print("工具的數量是 %d"% tool2.count)
-
四、類方法 和 靜態方法
-
4.1、類方法
-
類屬性 就是針對 類對象 定義的屬性
- 使用
賦值語句
在class
關鍵字下方可以定義類屬性
-
類屬性
用于記錄與這個類相關
的特征
- 使用
-
類方法
就是針對類對象
定義的方法- 在
類方法
內部可以直接訪問類屬性
或者調用其他的類方法
- 在
-
語法如下
@classmethod def 類方法名(cls): pass
- 類方法需要用
修飾器
@classmethod
來標識,告訴解釋器這是一個類方法
- 類方法的
第一個參數
應該是cls
- 由
哪一個類
調用的方法,方法內的cls
就是哪一個類的引用
- 這個參數和
實例方法
的第一個參數是self
類似 -
提示
使用其他名稱也可以,不過習慣使用cls
- 由
- 通過
類名.
調用類方法
,調用方法時,不需要傳遞cls
參數 -
在方法內部
- 可以通過
cls.
訪問類的屬性 - 也可以通過
cls.
調用其他的類方法
- 可以通過
在類方法內部,可以直接使用
cls
訪問類屬性
或者 `調用類方法 - 類方法需要用
-
-
4.2、類方法定義以及使用的案例
需求:定義一個
Person類
,定義一個類屬性:name
,類方法:run
跑步,在類方法run
里面打印類屬性name
class Person(object): name = "" @classmethod def run(cls): print("%s 會跑"%cls.name) Person.name = "小米" Person.run()
-
4.3、靜態方法
-
在開發時,如果需要在
類
中封裝一個方法,這個方法:- 既
不需要
訪問實例屬性
或者調用實例方法
- 也
不需要
訪問類屬性
或者調用類方法
- 既
-
語法如下(不需要任何參數的)
@staticmethod def 靜態方法名(): pass
靜態方法
需要用 修飾器@staticmethod
來標識,告訴解釋器這是一個靜態方法
通過
類名.
調用 靜態方法-
實例:
class Baby(object): @staticmethod def cry(): # 不需要訪問實例屬性也不需要訪問類屬性的方法 print("小孩在哭...") Baby.cry()
-
五、綜合案例
-
5.1、需求
- (1)、設計一個
Game
類,模擬吃雞游戲
- (2)、屬性:
- 定義一個 類屬性
top_score
記錄游戲的 歷史最高分 - 定義一個 實例屬性
player_name
記錄 當前游戲的玩家姓名
- 定義一個 類屬性
- (3)、方法:
-
靜態方法
show_help
顯示游戲幫助信息 -
類方法
show_top_score
顯示歷史最高分 -
實例方法
start_game
開始當前玩家的游戲
-
靜態方法
- (4)、主程序步驟
查看幫助信息
查看歷史最高分
-
創建游戲對象,開始游戲
class Game(object): # 游戲最高分,類屬性 top_score = 0 @staticmethod def show_help(): print("幫助信息:吃雞游戲開始啦") @classmethod def show_top_score(cls): print("游戲最高分是 %d" % cls.top_score) def __init__(self, player_name): self.player_name = player_name def start_game(self): print("[%s] 開始游戲..." % self.player_name) # 使用類名.修改歷史最高分 Game.top_score = 10000 # 1. 查看游戲幫助 Game.show_help() # 2. 查看游戲最高分 Game.show_top_score() # 3. 創建游戲對象,開始游戲 game = Game("二郎神") game.start_game() # 4. 游戲結束,查看游戲最高分 Game.show_top_score()
- (1)、設計一個
-
5.2、總結
-
實例方法 —— 方法內部需要訪問 實例屬性
-
實例方法 內部可以使用
類名.
訪問類屬性
-
實例方法 內部可以使用
- 類方法 —— 方法內部 只 需要訪問 類屬性
- 靜態方法 —— 方法內部,不需要訪問 實例屬性 和 類屬性
-
實例方法 —— 方法內部需要訪問 實例屬性