Python面向對象之類屬性類方法靜態方法,內容包括 類的結構,類屬性和實例屬性,類方法和靜態方法,方法綜合案例等。其中,類的結構 包括 實例,類是一個特殊的對象;類屬性和實例屬性 包括 類屬性的定義及使用,屬性的查找機制-向上查找;類方法和靜態方法 包括 類方法,靜態方法;方法綜合案例 僅包含 游... ...
類的結構
實例
使用面向對象開發時,第一步是設計類;
當使用 類名() 創建對象時,會自動執行以下操作:
1.為對象在記憶體中分配空間--創建對象;
2.為對象的屬性 設置初始值--初始化方法(init);
對象創建後,記憶體中就有了一個對象的實實在在的存在--實例;
因此通常也會把:
1.創建出來的對象叫做類的實例;
2.創建對象的動作叫實例化;
3.對象的屬性叫實例屬性;
4.對象調用的方法叫實例方法;
在程式執行時:
1.對象各自擁有自己的實例屬性;
2.調用對象方法,可以通過self. 訪問自己的屬性/調用自己的方法;
結論:
1.每一個對象都有自己的記憶體空間,保存各自不同的屬性;
2.多個對象的方法,在記憶體中只有一份,在調用方法的時候,需要把對象的引用傳遞到方法內部;
類是一個特殊的對象
Python中,一切皆對象:
class AAA: 定義的類屬於類對象;
obj1 = AAA() 屬於實例對象;
- 程式運行時,類同樣會被載入到記憶體中;
- 在Python中,類是一個特殊的對象--類對象;
- 在程式運行時,類對象在記憶體中只有一個,使用一個類可以創建出很多對象實例;
- 除了封裝實例的屬性和方法外,類對象還可以擁有自己的屬性和方法--類屬性;類方法;
- 通過類名. 的方式可以訪問類的屬性或者調用類的方法;
代碼分層為:
1.類屬性
2.類方法(cls)
3.__init__定義實例屬性
4.實例方法(self)
類屬性和實例屬性
類屬性的定義及使用
類屬性就是給類對象定義的屬性;
通常用來記錄與這個類相關的特征;
類屬性不會用於記錄具體對象的特征;
定義一個植物類,每新添一種植物就讓植物類計數+1
class Plant(object):
# 使用賦值語句定義類屬性,記錄所有植物對象的數量
count = 0
def __init__(self, name):
self.name = name
# 每初始化一次,就讓類屬性的值+1
Plant.count += 1
# 創建植物對象
duorou = Plant("多肉")
print("目前已養植物種類數量:", Plant.count)
# 目前已養植物種類數量: 1
luhui = Plant("蘆薈")
yingtao = Plant("櫻桃")
# 輸出植物對象的總數
print("目前已養植物種類數量:", Plant.count)
# 目前已養植物種類數量: 3
屬性的查找機制-向上查找
在python中 屬性的獲取存在一個向上查找機制:
1.首先在對象內部查找對象屬性;
2.沒有找到就會向上查找類屬性;
因此,要訪問類屬性有兩種方式:
1.類名.類屬性
2.對象.類屬性(不推薦)
註意:如果使用 對象.類屬性=值 賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值;
可以用 對象.類屬性 查看類屬性,但不能用 對象.類屬性=值 給它賦值;
如果使用 對象.類屬性=值 賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值;
類方法和靜態方法
類方法
類方法概念和定義語法
類屬性 就是針對類對象定義的屬性;
使用賦值語句在關鍵字class下麵可以定義類屬性;
類屬性用來記錄與這個類相關的特征;
類方法 就是針對類對象定義的方法;
在類方法內部可以直接調用類屬性或者其他的類方法;
類方法定義語法如下:
@classmethod
def 類方法名(cls):
pass
類方法需要@classmethod來進行修飾,告訴解釋器這是一個類方法;
類方法的第一個參數應該是cls;
由哪一個類調用的類方法,方法內部的cls就是哪一個類的引用;
這個參數和實例方法的第一個參數是self類似;
使用其他名稱也可以,但一般習慣使用cls;
通過 類名. 調用類方法,調用類方法時,不需要傳遞cls參數;
在方法內部,
可以通過 cls. 調用類屬性;
通過 cls. 也可以調用其他類的方法;
在類方法內部可以直接使用cls 訪問類屬性或者其他的類方法;
類方法案例演示
class Plant(object):
# 使用賦值語句定義類屬性,記錄所有植物對象的數量
count = 0
# 定義一個類方法
@classmethod
def show_count(cls):
print("目前已養植物種類數量:", Plant.count)
def __init__(self, name):
self.name = name
Plant.count += 1
duorou = Plant("多肉")
luhui = Plant("蘆薈")
# 調用類方法
Plant.show_count() # 目前已養植物種類數量: 2
靜態方法
靜態方法概念和語法
在開發時,如果需要在類中定義一個方法,這個方法:
既不需要訪問實例屬性也不需要調用實例方法;
既不需要訪問類屬性也不需要調用類方法;
這個時候,就可以把這個方法封裝成靜態方法;
靜態方法語法如下:
@staticmethod
def 靜態方法名():
pass
靜態方法需要修飾器 @staticmethod 來表示,告訴解釋器這是一個靜態方法;
通過 類名. 調用靜態方法;
靜態方法示例
class Dog(object):
@staticmethod
def run():
# 不需要訪問類屬性和實例屬性的方法,就可以定義一個靜態方法
print("跳著跑")
def __init__(self, name):
self.name = name
def bark(self):
pass
# 通過 類名. 調用靜態方法,不需要創建對象
Dog.run()
方法綜合案例
案例需求:
1.設計一個Game類
2.屬性:
定義一個類屬性top_score記錄游戲最高分
定義一個實例屬性palyer記錄游戲玩家名字
3.方法:
靜態方法show_help查看游戲幫助信息;
類方法show_topscore顯示游戲最高分;
實例方法start_game開始當前玩家的游戲
4.主程式步驟
查看幫助信息
查看歷史最高分
創建游戲對象,開始游戲
案例分析:
歷史最高成績--類屬性
玩家姓名--實例屬性
顯示玩法--靜態方法
顯示歷史最高成績--類方法
進入游戲--實例方法
綜合案例演練
同時使用類屬性,實例屬性,靜態方法,類方法,實例方法;
class Game(object):
top_score = 0
@staticmethod
def game_help():
print("游戲幫助信息")
@classmethod
def show_topscore(cls):
print("歷史最高分數是:", cls.top_score)
def __init__(self, name):
self.name = name
def play_game(self):
print("%s 開始游戲了" % self.name)
# 查看游戲幫助文檔
Game.game_help()
# 查看歷史最高分
Game.show_topscore()
# 創建游戲對象
xiaoming = Game("小明")
# 進入游戲
xiaoming.play_game()
# 游戲幫助信息
# 歷史最高分數是: 0
# 小明 開始游戲了
案例小結:
1.實例方法--方法內部需要訪問實例屬性;方法內部可以使用 類名. 查看類屬性;
2.類方法--方法內部只需要訪問類屬性;
3.靜態方法--方法內部既不需要訪問類屬性也不需要訪問靜態屬性;
提示:當一個方法內急需要訪問實例屬性也需要訪問類屬性時,應該使用示例方法;因為類只有一個,實例方法內部可以使用 類名. 查看類屬性;