类属性和类方法
一、 類的結(jié)構(gòu)
1.1 術(shù)語 —— 實例
使用面相對象開發(fā),第 1 步是設(shè)計類
使用類名()創(chuàng)建對象,創(chuàng)建對象的動作有兩步:
1) 在內(nèi)存中為對象分配空間
2) 調(diào)用初始化方法__init__為對象初始化
對象創(chuàng)建后,內(nèi)存中就有了一個對象的實實在在的存在 ——實例
因此,通常也會把:
創(chuàng)建出來的對象叫做類的實例
創(chuàng)建對象的動作叫做實例化
對象的屬性叫做實例屬性
對象調(diào)用的方法叫做實例方法
在程序執(zhí)行時:
對象各自擁有自己的實例屬性
調(diào)用對象方法,可以通過self.
訪問自己的屬性
調(diào)用自己的方法
結(jié)論
每一個對象都有自己獨立的內(nèi)存空間,保存各自不同的屬性
多個對象的方法,在內(nèi)存中只有一份,在調(diào)用方法時,需要把對象的引用傳遞到方法內(nèi)部
1.2 類是一個特殊的對象
Python中一切皆對象:
class AAA:定義的類屬于類對象
obj1 = AAA() 屬于實例對象
在程序運行時,類同樣會被加載到內(nèi)存
在Python中,類是一個特殊的對象 ——類對象
在程序運行時,類對象在內(nèi)存中只有一份,使用一個類可以創(chuàng)建出很多個對象實例
除了封裝實例的屬性和方法外,類對象還可以擁有自己的屬性和方法
類屬性
類方法
通過類名.的方式可以訪問類的屬性或者調(diào)用類的方法
二、類屬性和實例屬性
2.1 概念和使用
類屬性就是給類對象中定義的屬性
通常用來記錄與這個類相關(guān)的特征
類屬性不會用于記錄具體對象的特征
示例需求
定義一個工具類
每件工具都有自己的name
需求—— 知道使用這個類,創(chuàng)建了多少個工具對象?
class Tool(object):
count = 0
def __init__(self, name):
self.name = name
Tool.count += 1
futou = Tool("斧頭")
langtou = Tool("榔頭")
print("創(chuàng)建了%d個工具" % Tool.count)
2.2 屬性的獲取機制
在Python中屬性的獲取存在一個向上查找機制
因此,要訪問類屬性有兩種方式:
類名.類屬性
對象.類屬性(不推薦)
注意
如果使用 對象.類屬性 = 值賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值
三、 類方法和靜態(tài)方法
3.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ù)是 self類似
提示使用其他名稱也可以,不過習(xí)慣使用 cls
通過類名.調(diào)用類方法,調(diào)用方法時,不需要傳遞cls參數(shù)
在方法內(nèi)部
可以通過 cls.訪問類的屬性
也可以通過cls.調(diào)用其他的類方法
示例需求
定義一個工具類
每件工具都有自己的name
需求—— 在類封裝一個 show_tool_count的類方法,輸出使用當(dāng)前這個類,創(chuàng)建的對象個數(shù)
class Tool(object):
count = 0
def __init__(self, name):
self.name = name
Tool.count += 1
@classmethod
def show_tool_count(cls):
print("工具對象有%d個" % cls.count)
futou = Tool("斧頭")
langtou = Tool("榔頭")
print("創(chuàng)建了%d個工具" % Tool.count)
Tool.show_tool_count()
在類方法內(nèi)部,可以直接使用 cls訪問類屬性或者調(diào)用類方法
3.2 靜態(tài)方法
在開發(fā)時,如果需要在類中封裝一個方法,這個方法:
既不需要訪問實例屬性或者調(diào)用實例方法
也不需要訪問類屬性或者調(diào)用類方法
這個時候,可以把這個方法封裝成一個靜態(tài)方法
語法如下
@staticmethod
def 靜態(tài)方法名():
pass
靜態(tài)方法需要用修飾器 @staticmethod 來標(biāo)識,告訴解釋器這是一個靜態(tài)方法
通過類名.調(diào)用靜態(tài)方法
class Tool(object):
count = 0
def __init__(self, name):
self.name = name
Tool.count += 1
@classmethod
def show_tool_count(cls):
print("工具對象有%d個" % cls.count)
@staticmethod
def run():
# 不需要訪問實例屬性也不需要訪問類屬性的方法
print("正在創(chuàng)建工具")
futou = Tool("斧頭")
langtou = Tool("榔頭")
print("創(chuàng)建了%d個工具" % Tool.count)
Tool.show_tool_count()
Tool.run()
3.3 方法綜合案例
需求
設(shè)計一個 Game類
屬性:
定義一個類屬性top_score記錄游戲的歷史最高分
定義一個實例屬性player_name記錄當(dāng)前游戲的玩家姓名
方法:
靜態(tài)方法show_help 顯示游戲幫助信息
類方法show_top_score顯示歷史最高分
實例方法start_game開始當(dāng)前玩家的游戲
主程序步驟
1) 查看幫助信息
2) 查看歷史最高分
3) 創(chuàng)建游戲?qū)ο螅_始游戲
案例小結(jié)
實例方法—— 方法內(nèi)部需要訪問實例屬性
實例方法內(nèi)部可以使用類名.訪問類屬性
類方法—— 方法內(nèi)部只需要訪問類屬性
靜態(tài)方法—— 方法內(nèi)部,不需要訪問實例屬性和類屬性
提問
如果方法內(nèi)部 即需要訪問實例屬性,又需要訪問類屬性,應(yīng)該定義成什么方法?
答案
應(yīng)該定義實例方法
因為,類只有一個,在實例方法內(nèi)部可以使用類名.訪問類屬性
class Game(object):
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
@staticmethod
def show_help():
print("游戲幫助")
@classmethod
def show_top_score(cls):
print("當(dāng)前游戲最高分%d" % cls.top_score)
def start_game(self):
print("%s 開始了游戲" % self.player_name)
Game.top_score = 999
Game.show_help()
Game.show_top_score()
xiaobai = Game("小白")
xiaobai.start_game()
Game.show_top_score()
總結(jié)
- 上一篇: Java 8 安装——使用华为镜像
- 下一篇: 你知道PORT吗?