一、總體目錄
- 1.1麸锉、類的結(jié)構(gòu)
- 1.2钠绍、類屬性和實(shí)例屬性
- 1.3、類方法和靜態(tài)方法
二花沉、類的結(jié)構(gòu)
-
2.1柳爽、術(shù)語 -實(shí)例
使用面相對象開發(fā),第 1 步 是設(shè)計 類
-
使用 類名() 創(chuàng)建對象碱屁,創(chuàng)建對象 的動作有兩步:
(1) 在內(nèi)存中為對象 分配空間
-
(2) 調(diào)用初始化方法
__init__
為 對象初始化
對象創(chuàng)建后磷脯,內(nèi)存 中就有了一個對象的 實(shí)實(shí)在在 的存在 —實(shí)例
- 創(chuàng)建出來的
對象
叫做類 的 實(shí)例
- 創(chuàng)建對象的
動作
叫做實(shí)例化
- 對象的
屬性
叫做實(shí)例屬性
- 對象調(diào)用的
方法
叫做實(shí)例方法
- 創(chuàng)建出來的
-
在程序執(zhí)行時
- 對象各自擁有自己的
實(shí)例屬性
- 調(diào)用對象方法,可以通過
self.
- 對象各自擁有自己的
結(jié)論
- 每一個對象 都有自己
獨(dú)立的內(nèi)存空間
娩脾,保存各自不同的屬性 - 多個對象的方法赵誓,
在內(nèi)存中只有一份
,在調(diào)用方法時柿赊,需要把對象的引用
傳遞到方法內(nèi)部
-
2.2 類是一個特殊的對象
Python 中 一切皆對象:
- class AAA: 定義的類屬于 類對象
- obj1 = AAA() 屬于 實(shí)例對象
在程序運(yùn)行時俩功,
類
同樣會被加載到內(nèi)存
在 Python 中,
類
是一個特殊的對象 ——類對象
在程序運(yùn)行時闹瞧,
類對象
在內(nèi)存中只有一份
绑雄,使用一個類
可以創(chuàng)建出很多個對象實(shí)例
-
除了封裝
實(shí)例
的屬性
和方法
外,類對象
還可以擁有自己的屬性
和方法
- 類屬性
- 類方法
- 通過
類名.
的方式可以訪問類的屬性
或者調(diào)用類的方法
類的結(jié)構(gòu)示意圖
三奥邮、類屬性 和 實(shí)例屬性
-
3.1 概念和使用
類屬性 就是給 類對象 中定義的 屬性
通常用來記錄 與這個類相關(guān) 的特征
類屬性 不會用于記錄 具體對象的特征
-
如下例子万牺,定義一個 類屬性
count
,記錄創(chuàng)建類的個數(shù)class Tool(object): # 使用賦值語句洽腺,定義類屬性脚粟,記錄創(chuàng)建工具對象的總數(shù) count = 0 def __init__(self,name): # 針對類屬性做一個計數(shù)+1 Tool.count += 1 self.name = name # 創(chuàng)建工具對象 tool1 = Tool("斧頭") tool2 = Tool("鐮刀") # 知道使用 Tool 類到底創(chuàng)建了多少個對象? print("工具的數(shù)量是 %d"%Tool.count)
類屬性的創(chuàng)建:在類的下面使用賦值語句,等號左邊是類屬性的名字,右邊是類屬性的初始值 ;使用是:
類名.屬性名
, 如上面的 count
-
3.2蘸朋、屬性的獲取機(jī)制-
向上查找機(jī)制
-
在 Python 中 屬性的獲取 存在一個 向上查找機(jī)制(下面代碼 Tool.count 與 tool2.count)
class Tool(object): # 使用賦值語句核无,定義類屬性,記錄創(chuàng)建工具對象的總數(shù) count = 0 def __init__(self,name): # 針對類屬性做一個計數(shù)+1 Tool.count += 1 self.name = name # 創(chuàng)建 工具對象 tool1 = Tool("斧頭") tool2 = Tool("鐮刀") # 知道使用 Tool 類到底創(chuàng)建了多少個對象? # print("工具的數(shù)量是 %d"%Tool.count) print("工具的數(shù)量是 %d"% tool2.count)
說明查找機(jī)制:首先上面的代碼
tool2.count
藕坯,tools這個對象是沒有count
這個屬性的团南,這時候就會去類的屬性里面去找有沒有count
,如果類里面也沒有的話就報錯-
由上面可知,要訪問類屬性有兩種方式:
- 類名.類屬性
- 對象.類屬性 (不推薦)
-
注意:如果使用
對象.類屬性 = 值
賦值語句炼彪,只會給對象添加一個屬性
吐根,而不會影響到類屬性的值
如上面的代碼修改后(
tool2.count
就不靠譜了,僅僅是為 tool2添加了一個屬性而已)# 創(chuàng)建 工具對象 tool1 = Tool("斧頭") tool2 = Tool("鐮刀") # 知道使用 Tool 類到底創(chuàng)建了多少個對象? print("工具的數(shù)量是 %d"%Tool.count) tool2.count = 100 print("工具的數(shù)量是 %d"% tool2.count)
-
四辐马、類方法 和 靜態(tài)方法
-
4.1拷橘、類方法
-
類屬性 就是針對 類對象 定義的屬性
- 使用
賦值語句
在class
關(guān)鍵字下方可以定義類屬性
-
類屬性
用于記錄與這個類相關(guān)
的特征
- 使用
-
類方法
就是針對類對象
定義的方法- 在
類方法
內(nèi)部可以直接訪問類屬性
或者調(diào)用其他的類方法
- 在
-
語法如下
@classmethod def 類方法名(cls): pass
- 類方法需要用
修飾器
@classmethod
來標(biāo)識,告訴解釋器這是一個類方法
- 類方法的
第一個參數(shù)
應(yīng)該是cls
- 由
哪一個類
調(diào)用的方法,方法內(nèi)的cls
就是哪一個類的引用
- 這個參數(shù)和
實(shí)例方法
的第一個參數(shù)是self
類似 -
提示
使用其他名稱也可以冗疮,不過習(xí)慣使用cls
- 由
- 通過
類名.
調(diào)用類方法
萄唇,調(diào)用方法時,不需要傳遞cls
參數(shù) -
在方法內(nèi)部
- 可以通過
cls.
訪問類的屬性 - 也可以通過
cls.
調(diào)用其他的類方法
- 可以通過
在類方法內(nèi)部术幔,可以直接使用
cls
訪問類屬性
或者 `調(diào)用類方法 - 類方法需要用
-
-
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拔恰、靜態(tài)方法
-
在開發(fā)時廊营,如果需要在
類
中封裝一個方法仔燕,這個方法:- 既
不需要
訪問實(shí)例屬性
或者調(diào)用實(shí)例方法
- 也
不需要
訪問類屬性
或者調(diào)用類方法
- 既
-
語法如下(不需要任何參數(shù)的)
@staticmethod def 靜態(tài)方法名(): pass
靜態(tài)方法
需要用 修飾器@staticmethod
來標(biāo)識,告訴解釋器這是一個靜態(tài)方法
通過
類名.
調(diào)用 靜態(tài)方法-
實(shí)例:
class Baby(object): @staticmethod def cry(): # 不需要訪問實(shí)例屬性也不需要訪問類屬性的方法 print("小孩在哭...") Baby.cry()
-
五敢靡、綜合案例
-
5.1、需求
- (1)、設(shè)計一個
Game
類毒嫡,模擬吃雞游戲
- (2)、屬性:
- 定義一個 類屬性
top_score
記錄游戲的 歷史最高分 - 定義一個 實(shí)例屬性
player_name
記錄 當(dāng)前游戲的玩家姓名
- 定義一個 類屬性
- (3)幻梯、方法:
-
靜態(tài)方法
show_help
顯示游戲幫助信息 -
類方法
show_top_score
顯示歷史最高分 -
實(shí)例方法
start_game
開始當(dāng)前玩家的游戲
-
靜態(tài)方法
- (4)兜畸、主程序步驟
查看幫助信息
查看歷史最高分
-
創(chuàng)建游戲?qū)ο螅_始游戲
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. 創(chuàng)建游戲?qū)ο笠б。_始游戲 game = Game("二郎神") game.start_game() # 4. 游戲結(jié)束,查看游戲最高分 Game.show_top_score()
- (1)、設(shè)計一個
-
5.2煞躬、總結(jié)
-
實(shí)例方法 —— 方法內(nèi)部需要訪問 實(shí)例屬性
-
實(shí)例方法 內(nèi)部可以使用
類名.
訪問類屬性
-
實(shí)例方法 內(nèi)部可以使用
- 類方法 —— 方法內(nèi)部 只 需要訪問 類屬性
- 靜態(tài)方法 —— 方法內(nèi)部肛鹏,不需要訪問 實(shí)例屬性 和 類屬性
-
實(shí)例方法 —— 方法內(nèi)部需要訪問 實(shí)例屬性