python面向?qū)ο笾?lèi)屬性和類(lèi)方法案例分析
本文實(shí)例講述了python面向?qū)ο笾?lèi)屬性和類(lèi)方法。分享給大家供大家參考,具體如下:
目標(biāo)
類(lèi)的結(jié)構(gòu)
類(lèi)屬性和實(shí)例屬性
類(lèi)方法和靜態(tài)方法
01. 類(lèi)的結(jié)構(gòu)
1.1 術(shù)語(yǔ) —— 實(shí)例
使用面相對(duì)象開(kāi)發(fā),第 1 步 是設(shè)計(jì) 類(lèi)
使用 類(lèi)名() 創(chuàng)建對(duì)象,創(chuàng)建對(duì)象 的動(dòng)作有兩步:
- 在內(nèi)存中為對(duì)象 分配空間
- 調(diào)用初始化方法 init 為 對(duì)象初始化
對(duì)象創(chuàng)建后,內(nèi)存 中就有了一個(gè)對(duì)象的 實(shí)實(shí)在在 的存在 —— 實(shí)例

因此,通常也會(huì)把:
創(chuàng)建出來(lái)的 對(duì)象 叫做 類(lèi) 的 實(shí)例
創(chuàng)建對(duì)象的 動(dòng)作 叫做 實(shí)例化
對(duì)象的屬性 叫做 實(shí)例屬性
對(duì)象調(diào)用的方法 叫做 實(shí)例方法
在程序執(zhí)行時(shí):
對(duì)象各自擁有自己的 實(shí)例屬性
調(diào)用對(duì)象方法,可以通過(guò) self.
訪問(wèn)自己的屬性
調(diào)用自己的方法
結(jié)論
每一個(gè)對(duì)象 都有自己 獨(dú)立的內(nèi)存空間,保存各自不同的屬性
多個(gè)對(duì)象的方法,在內(nèi)存中只有一份,在調(diào)用方法時(shí),需要把對(duì)象的引用 傳遞到方法內(nèi)部
1.2 類(lèi)是一個(gè)特殊的對(duì)象
Python 中 一切皆對(duì)象:
class AAA: 定義的類(lèi)屬于 類(lèi)對(duì)象
obj1 = AAA() 屬于 實(shí)例對(duì)象
在程序運(yùn)行時(shí),類(lèi) 同樣 會(huì)被加載到內(nèi)存
在 Python 中,類(lèi) 是一個(gè)特殊的對(duì)象 —— 類(lèi)對(duì)象
在程序運(yùn)行時(shí),類(lèi)對(duì)象 在內(nèi)存中 只有一份,使用 一個(gè)類(lèi) 可以創(chuàng)建出 很多個(gè)對(duì)象實(shí)例
除了封裝 實(shí)例 的 屬性 和 方法外,類(lèi)對(duì)象 還可以擁有自己的 屬性 和 方法
類(lèi)屬性
類(lèi)方法
通過(guò) 類(lèi)名. 的方式可以 訪問(wèn)類(lèi)的屬性 或者 調(diào)用類(lèi)的方法

02. 類(lèi)屬性和實(shí)例屬性
2.1 概念和使用
類(lèi)屬性 就是給 類(lèi)對(duì)象 中定義的 屬性
通常用來(lái)記錄 與這個(gè)類(lèi)相關(guān) 的特征
類(lèi)屬性 不會(huì)用于記錄 具體對(duì)象的特征
示例需求
定義一個(gè) 工具類(lèi)
每件工具都有自己的 name
需求 —— 知道使用這個(gè)類(lèi),創(chuàng)建了多少個(gè)工具對(duì)象?

class Tool(object):
# 使用賦值語(yǔ)句,定義類(lèi)屬性,記錄創(chuàng)建工具對(duì)象的總數(shù)
count = 0
def __init__(self, name):
self.name = name
# 針對(duì)類(lèi)屬性做一個(gè)計(jì)數(shù)+1
Tool.count += 1
# 創(chuàng)建工具對(duì)象
tool1 = Tool("斧頭")
tool2 = Tool("榔頭")
tool3 = Tool("鐵鍬")
# 知道使用 Tool 類(lèi)到底創(chuàng)建了多少個(gè)對(duì)象?
print("現(xiàn)在創(chuàng)建了 %d 個(gè)工具" % Tool.count)
2.2 屬性的獲取機(jī)制(科普)
在 Python 中 屬性的獲取 存在一個(gè) 向上查找機(jī)制

因此,要訪問(wèn)類(lèi)屬性有兩種方式:
類(lèi)名.類(lèi)屬性
對(duì)象.類(lèi)屬性 (不推薦)
注意
如果使用 對(duì)象.類(lèi)屬性 = 值 賦值語(yǔ)句,只會(huì) 給對(duì)象添加一個(gè)屬性,而不會(huì)影響到 類(lèi)屬性的值
03. 類(lèi)方法和靜態(tài)方法
3.1 類(lèi)方法
類(lèi)屬性 就是針對(duì) 類(lèi)對(duì)象 定義的屬性
使用 賦值語(yǔ)句 在 class 關(guān)鍵字下方可以定義 類(lèi)屬性
類(lèi)屬性 用于記錄 與這個(gè)類(lèi)相關(guān) 的特征
類(lèi)方法 就是針對(duì) 類(lèi)對(duì)象 定義的方法
在 類(lèi)方法 內(nèi)部可以直接訪問(wèn) 類(lèi)屬性 或者調(diào)用其他的 類(lèi)方法
語(yǔ)法如下
@classmethod def 類(lèi)方法名(cls): pass
類(lèi)方法需要用 修飾器 @classmethod 來(lái)標(biāo)識(shí),告訴解釋器這是一個(gè)類(lèi)方法
類(lèi)方法的 第一個(gè)參數(shù) 應(yīng)該是 cls
由 哪一個(gè)類(lèi) 調(diào)用的方法,方法內(nèi)的 cls 就是 哪一個(gè)類(lèi)的引用
這個(gè)參數(shù)和 實(shí)例方法 的第一個(gè)參數(shù)是 self 類(lèi)似
提示 使用其他名稱(chēng)也可以,不過(guò)習(xí)慣使用 cls
通過(guò) 類(lèi)名. 調(diào)用 類(lèi)方法,調(diào)用方法時(shí),不需要傳遞 cls 參數(shù)
在方法內(nèi)部
可以通過(guò) cls. 訪問(wèn)類(lèi)的屬性
也可以通過(guò) cls. 調(diào)用其他的類(lèi)方法
示例需求
定義一個(gè) 工具類(lèi)
每件工具都有自己的 name
需求 —— 在 類(lèi) 封裝一個(gè) show_tool_count 的類(lèi)方法,輸出使用當(dāng)前這個(gè)類(lèi),創(chuàng)建的對(duì)象個(gè)數(shù)

@classmethod
def show_tool_count(cls):
"""顯示工具對(duì)象的總數(shù)"""
print("工具對(duì)象的總數(shù) %d" % cls.count)
在類(lèi)方法內(nèi)部,可以直接使用 cls 訪問(wèn) 類(lèi)屬性 或者 調(diào)用類(lèi)方法
3.2 靜態(tài)方法
在開(kāi)發(fā)時(shí),如果需要在 類(lèi) 中封裝一個(gè)方法,這個(gè)方法:
既 不需要 訪問(wèn) 實(shí)例屬性 或者調(diào)用 實(shí)例方法
也 不需要 訪問(wèn) 類(lèi)屬性 或者調(diào)用 類(lèi)方法
這個(gè)時(shí)候,可以把這個(gè)方法封裝成一個(gè) 靜態(tài)方法
語(yǔ)法如下
@staticmethod def 靜態(tài)方法名(): pass
靜態(tài)方法 需要用 修飾器 @staticmethod 來(lái)標(biāo)識(shí),告訴解釋器這是一個(gè)靜態(tài)方法
通過(guò) 類(lèi)名. 調(diào)用 靜態(tài)方法
class Dog(object):
# 狗對(duì)象計(jì)數(shù)
dog_count = 0
@staticmethod
def run():
# 不需要訪問(wèn)實(shí)例屬性也不需要訪問(wèn)類(lèi)屬性的方法
print("狗在跑...")
def __init__(self, name):
self.name = name
3.3 方法綜合案例
需求
設(shè)計(jì)一個(gè) Game 類(lèi)
屬性:
定義一個(gè) 類(lèi)屬性 top_score 記錄游戲的 歷史最高分
定義一個(gè) 實(shí)例屬性 player_name 記錄 當(dāng)前游戲的玩家姓名
方法:
靜態(tài)方法 show_help 顯示游戲幫助信息
類(lèi)方法 show_top_score 顯示歷史最高分
實(shí)例方法 start_game 開(kāi)始當(dāng)前玩家的游戲
主程序步驟
- 查看幫助信息
- 查看歷史最高分
- 創(chuàng)建游戲?qū)ο螅_(kāi)始游戲

案例小結(jié)
實(shí)例方法 —— 方法內(nèi)部需要訪問(wèn) 實(shí)例屬性
實(shí)例方法 內(nèi)部可以使用 類(lèi)名. 訪問(wèn)類(lèi)屬性
類(lèi)方法 —— 方法內(nèi)部 只 需要訪問(wèn) 類(lèi)屬性
靜態(tài)方法 —— 方法內(nèi)部,不需要訪問(wèn) 實(shí)例屬性 和 類(lèi)屬性
提問(wèn)
如果方法內(nèi)部 即需要訪問(wèn) 實(shí)例屬性,又需要訪問(wèn) 類(lèi)屬性,應(yīng)該定義成什么方法?
答案
應(yīng)該定義 實(shí)例方法
因?yàn)?,?lèi)只有一個(gè),在 實(shí)例方法 內(nèi)部可以使用 類(lèi)名. 訪問(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)建游戲?qū)ο?,開(kāi)始游戲
game = Game("小明")
game.start_game()
# 4. 游戲結(jié)束,查看游戲最高分
Game.show_top_score()
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
在Linux系統(tǒng)上安裝Python的Scrapy框架的教程
這篇文章主要介紹了在Linux系統(tǒng)上安裝Python的Scrapy框架的教程,Scrapy是著名的專(zhuān)門(mén)針對(duì)搜索引擎的爬蟲(chóng)制作而研發(fā)的Python框架,需要的朋友可以參考下2015-06-06
Flask使用Pyecharts在單個(gè)頁(yè)面展示多個(gè)圖表的方法
這篇文章主要介紹了Flask使用Pyecharts在單個(gè)頁(yè)面展示多個(gè)圖表的方法,在Flask頁(yè)面展示echarts,主要有兩種方法,文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-08-08
python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請(qǐng)求網(wǎng)站)
這篇文章主要介紹了python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請(qǐng)求網(wǎng)站),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Python基礎(chǔ)之模塊相關(guān)知識(shí)總結(jié)
今天帶大家復(fù)習(xí)Python基礎(chǔ)知識(shí),文中對(duì)模塊相關(guān)知識(shí)介紹的非常詳細(xì),對(duì)正在學(xué)習(xí)python基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
Python?OpenCV超詳細(xì)講解調(diào)整大小與圖像操作的實(shí)現(xiàn)
OpenCV用C++語(yǔ)言編寫(xiě),它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實(shí)時(shí)視覺(jué)應(yīng)用,并在可用時(shí)利用MMX和SSE指令,本篇文章帶你通過(guò)OpenCV實(shí)現(xiàn)重調(diào)大小與圖像裁剪2022-04-04

