- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- python面向對象之類(lèi)屬性和類(lèi)方法的示例分析
這篇文章給大家分享的是有關(guān)python面向對象之類(lèi)屬性和類(lèi)方法的示例分析的內容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
類(lèi)的結構
類(lèi)屬性和實(shí)例屬性
類(lèi)方法和靜態(tài)方法
使用面相對象開(kāi)發(fā),第 1 步 是設計 類(lèi)
使用 類(lèi)名() 創(chuàng )建對象,創(chuàng )建對象 的動(dòng)作有兩步:
在內存中為對象 分配空間
調用初始化方法 init 為 對象初始化
對象創(chuàng )建后,內存 中就有了一個(gè)對象的 實(shí)實(shí)在在 的存在 —— 實(shí)例
因此,通常也會(huì )把:
創(chuàng )建出來(lái)的 對象 叫做 類(lèi) 的 實(shí)例
創(chuàng )建對象的 動(dòng)作 叫做 實(shí)例化
對象的屬性 叫做 實(shí)例屬性
對象調用的方法 叫做 實(shí)例方法
在程序執行時(shí):
對象各自擁有自己的 實(shí)例屬性
調用對象方法,可以通過(guò) self.
訪(fǎng)問(wèn)自己的屬性
調用自己的方法
結論
每一個(gè)對象 都有自己 獨立的內存空間,保存各自不同的屬性
多個(gè)對象的方法,在內存中只有一份,在調用方法時(shí),需要把對象的引用 傳遞到方法內部
Python 中 一切皆對象:
class AAA: 定義的類(lèi)屬于 類(lèi)對象
obj1 = AAA() 屬于 實(shí)例對象
在程序運行時(shí),類(lèi) 同樣 會(huì )被加載到內存
在 Python 中,類(lèi) 是一個(gè)特殊的對象 —— 類(lèi)對象
在程序運行時(shí),類(lèi)對象 在內存中 只有一份,使用 一個(gè)類(lèi) 可以創(chuàng )建出 很多個(gè)對象實(shí)例
除了封裝 實(shí)例 的 屬性 和 方法外,類(lèi)對象 還可以擁有自己的 屬性 和 方法
類(lèi)屬性
類(lèi)方法
通過(guò) 類(lèi)名. 的方式可以 訪(fǎng)問(wèn)類(lèi)的屬性 或者 調用類(lèi)的方法
類(lèi)屬性 就是給 類(lèi)對象 中定義的 屬性
通常用來(lái)記錄 與這個(gè)類(lèi)相關(guān) 的特征
類(lèi)屬性 不會(huì )用于記錄 具體對象的特征
示例需求
定義一個(gè) 工具類(lèi)
每件工具都有自己的 name
需求 —— 知道使用這個(gè)類(lèi),創(chuàng )建了多少個(gè)工具對象?
class Tool(object): # 使用賦值語(yǔ)句,定義類(lèi)屬性,記錄創(chuàng )建工具對象的總數 count = 0 def __init__(self, name): self.name = name # 針對類(lèi)屬性做一個(gè)計數+1 Tool.count += 1 # 創(chuàng )建工具對象 tool1 = Tool("斧頭") tool2 = Tool("榔頭") tool3 = Tool("鐵鍬") # 知道使用 Tool 類(lèi)到底創(chuàng )建了多少個(gè)對象? print("現在創(chuàng )建了 %d 個(gè)工具" % Tool.count)
在 Python 中 屬性的獲取 存在一個(gè) 向上查找機制
因此,要訪(fǎng)問(wèn)類(lèi)屬性有兩種方式:
類(lèi)名.類(lèi)屬性
對象.類(lèi)屬性 (不推薦)
注意
如果使用 對象.類(lèi)屬性 = 值 賦值語(yǔ)句,只會(huì ) 給對象添加一個(gè)屬性,而不會(huì )影響到 類(lèi)屬性的值
類(lèi)屬性 就是針對 類(lèi)對象 定義的屬性
使用 賦值語(yǔ)句 在 class 關(guān)鍵字下方可以定義 類(lèi)屬性
類(lèi)屬性 用于記錄 與這個(gè)類(lèi)相關(guān) 的特征
類(lèi)方法 就是針對 類(lèi)對象 定義的方法
在 類(lèi)方法 內部可以直接訪(fǎng)問(wèn) 類(lèi)屬性 或者調用其他的 類(lèi)方法
語(yǔ)法如下
@classmethod def 類(lèi)方法名(cls): pass
類(lèi)方法需要用 修飾器 @classmethod 來(lái)標識,告訴解釋器這是一個(gè)類(lèi)方法
類(lèi)方法的 第一個(gè)參數 應該是 cls
由 哪一個(gè)類(lèi) 調用的方法,方法內的 cls 就是 哪一個(gè)類(lèi)的引用
這個(gè)參數和 實(shí)例方法 的第一個(gè)參數是 self 類(lèi)似
提示 使用其他名稱(chēng)也可以,不過(guò)習慣使用 cls
通過(guò) 類(lèi)名. 調用 類(lèi)方法,調用方法時(shí),不需要傳遞 cls 參數
在方法內部
可以通過(guò) cls. 訪(fǎng)問(wèn)類(lèi)的屬性
也可以通過(guò) cls. 調用其他的類(lèi)方法
示例需求
定義一個(gè) 工具類(lèi)
每件工具都有自己的 name
需求 —— 在 類(lèi) 封裝一個(gè) show_tool_count 的類(lèi)方法,輸出使用當前這個(gè)類(lèi),創(chuàng )建的對象個(gè)數
@classmethod def show_tool_count(cls): """顯示工具對象的總數""" print("工具對象的總數 %d" % cls.count)
在類(lèi)方法內部,可以直接使用 cls 訪(fǎng)問(wèn) 類(lèi)屬性 或者 調用類(lèi)方法
在開(kāi)發(fā)時(shí),如果需要在 類(lèi) 中封裝一個(gè)方法,這個(gè)方法:
既 不需要 訪(fǎng)問(wèn) 實(shí)例屬性 或者調用 實(shí)例方法
也 不需要 訪(fǎng)問(wèn) 類(lèi)屬性 或者調用 類(lèi)方法
這個(gè)時(shí)候,可以把這個(gè)方法封裝成一個(gè) 靜態(tài)方法
語(yǔ)法如下
@staticmethod def 靜態(tài)方法名(): pass
靜態(tài)方法 需要用 修飾器 @staticmethod 來(lái)標識,告訴解釋器這是一個(gè)靜態(tài)方法
通過(guò) 類(lèi)名. 調用 靜態(tài)方法
class Dog(object): # 狗對象計數 dog_count = 0 @staticmethod def run(): # 不需要訪(fǎng)問(wèn)實(shí)例屬性也不需要訪(fǎng)問(wèn)類(lèi)屬性的方法 print("狗在跑...") def __init__(self, name): self.name = name
需求
設計一個(gè) Game 類(lèi)
屬性:
定義一個(gè) 類(lèi)屬性 top_score 記錄游戲的 歷史最高分
定義一個(gè) 實(shí)例屬性 player_name 記錄 當前游戲的玩家姓名
方法:
靜態(tài)方法 show_help 顯示游戲幫助信息
類(lèi)方法 show_top_score 顯示歷史最高分
實(shí)例方法 start_game 開(kāi)始當前玩家的游戲
主程序步驟
查看幫助信息
查看歷史最高分
創(chuàng )建游戲對象,開(kāi)始游戲
案例小結
實(shí)例方法 —— 方法內部需要訪(fǎng)問(wèn) 實(shí)例屬性
實(shí)例方法 內部可以使用 類(lèi)名. 訪(fǎng)問(wèn)類(lèi)屬性
類(lèi)方法 —— 方法內部 只 需要訪(fǎng)問(wèn) 類(lèi)屬性
靜態(tài)方法 —— 方法內部,不需要訪(fǎng)問(wèn) 實(shí)例屬性 和 類(lèi)屬性
提問(wèn)
如果方法內部 即需要訪(fǎng)問(wèn) 實(shí)例屬性,又需要訪(fǎng)問(wèn) 類(lèi)屬性,應該定義成什么方法?
答案
應該定義 實(shí)例方法
因為,類(lèi)只有一個(gè),在 實(shí)例方法 內部可以使用 類(lèi)名. 訪(fǎng)問(wèn)類(lèi)屬性
class Game(object): # 游戲最高分,類(lèi)屬性 top_score = 0 @staticmethod def show_help(): print("幫助信息:讓僵尸走進(jìn)房間") @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] 開(kāi)始游戲..." % self.player_name) # 使用類(lèi)名.修改歷史最高分 Game.top_score = 999 # 1. 查看游戲幫助 Game.show_help() # 2. 查看游戲最高分 Game.show_top_score() # 3. 創(chuàng )建游戲對象,開(kāi)始游戲 game = Game("小明") game.start_game() # 4. 游戲結束,查看游戲最高分 Game.show_top_score()
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站