Python_從零開始學習_(41) 類屬性和類方法
阿新 • • 發佈:2018-11-02
目錄
1. 類的結構
1.1 術語 ---- 例項
- 使用面向物件開發, 第1步 是設計 類
- 使用 類名() 建立物件, 建立物件
1) 在記憶體中為物件 分配空間
2) 呼叫初始化方法 __init__ 為 物件初始化 - 物件建立後, 記憶體 中就有了一個物件的 實實在在 的存在 ---- 例項
因此, 通常也會把:
- 創建出來的 物件 叫做 類 的 例項
- 建立物件的 動作 叫做 例項化
- 物件的屬相 叫做 例項屬性
- 物件呼叫的方法 叫做 例項方法
在程式執行時:
- 物件各自擁有自己的 例項屬性
- 呼叫物件方法, 可以通過 self
- 訪問自己的屬性
- 呼叫自己的方法
結論
- 每一個物件 都有自己 獨立的記憶體空間. 儲存各自不同的屬性
- 多個物件的方法. 在記憶體中只有一份, 在呼叫方法時, 需要把物件的引用 傳遞到方法內部
1.2 類是一個特殊的物件
Python 中一切皆物件:
- class Person: 定義的類屬於 類物件
- xiaoming = Person() 屬於 例項物件
- 在程式執行時, 類
- 在 Python 中, 類 是一個特殊的物件 ---- 類物件
- 在程式執行時, 類物件 在記憶體中 只有一份, 使用 一個類 可以穿檢出 很多個物件例項
- 除了封裝 例項 的 屬性 和 方法 外. 類物件 還可以擁有自己的 屬性 和 方法
- 類屬性
- 類方法
- 通過 類名. 的方式可以 訪問類的屬性 或者 呼叫類的方法
2. 類屬性和例項屬性
2.1 概念和使用
-
類屬性 就是給 類物件 中定義的 屬性
-
通常用來記錄 與這個類相關 的特徵
-
類屬性 不會用於 記錄 具體物件的特徵
例項需求
- 定義一個 工具類
- 每件工具都有自己的 name
- 需求 ---- 知道使用這個類, 建立了多少個工具物件?
class Tool(object):
# 使用賦值語句定義類屬性, 記錄所有工具物件的數量
count = 0
def __init__(self, name):
self.name = name
# 讓類屬性的值+1
Tool.count += 1
# 1. 建立工具物件
tool1 = Tool("剪刀")
tool2 = Tool("石頭")
tool3 = Tool("布")
print(Tool.count)
2.2 屬性的獲取機制 (科普)
- 在 Python 中 屬性的獲取 存在一個 向上查詢機制
- 因此, 要訪問類屬性有兩種方式:
- 類名.類屬性
- 物件.類屬性 (不推薦)
注意
- 如果使用 物件.類屬性 = 值 賦值語句, 只會 給物件新增一個屬性, 而不會影響到 類屬性的值
3. 類方法和靜態方法
3.1 類方法
- 類屬性 就是針對 類物件 定義的屬性
- 使用 賦值語句 在 class 關鍵字下方可以定義 類屬性
- 類屬性 用於記錄 與這個類相關 的特徵
- 類方法 就是針對 類物件 定義的方法
- 在 類方法 內部可以直接訪問 類屬性 或者呼叫其他的 類方法
語法如下
@classmethod
def 類方法名(cls):
pass
- 類方法需要用 修飾器 @classmethod 來標識, 告訴直譯器這是一個類方法
- 類方法的 第一個引數 應該是 cls
- 可以通過 cls. 訪問類的屬性
- 也可以通過 cls. 呼叫其他的類方法
例項需求
- 定義一個 工具類
- 每件工具都有自己的 name
- 需求 ---- 在 類 封裝一個 show_tool_count 的類方法, 輸出使用當前這個類, 建立的物件個數
class Tool(object):
# 使用賦值語句定義類屬性, 記錄所有工具物件的數量
count = 0
@classmethod
def show_tool_count(cls):
print("工具物件的數量 %d" % cls.count)
def __init__(self, name):
self.name = name
# 讓類屬性的值+1
Tool.count += 1
# 1. 建立工具物件
tool1 = Tool("剪刀")
tool2 = Tool("石頭")
tool3 = Tool("布")
# 2. 輸出工具物件的總數
Tool.show_tool_count()
在類方法內部, 可以直接使用 cls 訪問 類屬性 或者 呼叫類方法
3.2 靜態方法
- 在開發時, 如果需要在 類 中封裝一個方法, 這個方法:
- 既 不需要 訪問 例項屬性 或者呼叫 例項方法
- 也 不需要 訪問 類屬性 或者呼叫 類方法
- 這個時候, 可以把這個方法裝成一個 靜態方法
語法如下
@staticmethod
def 靜態方法名():
pass
- 靜態方法 需要用 修飾器 @staticmethod 來標識, 告訴直譯器這是一個靜態方法
- 通過 類名. 通過 靜態方法
class Dog(object):
@staticmethod
def run():
# 不訪問例項屬性/類屬性
print("小狗要跑...")
# 通過類名. 呼叫靜態方法 - 不需要建立物件
Dog.run()
3.3 方法綜合案例
需求
- 設計一個 Game 類
- 屬性:
定義一個 類屬性 top_score 記錄遊戲的 歷史最高分
定義一個 例項屬性 player_name 記錄 當前遊戲的玩家姓名 - 方法:
靜態方法 show_help 顯示遊戲幫助資訊
類方法 show_top_score 顯示歷史最高分
例項方法 start_game 開始當前玩家的遊戲 - 主程式步驟
1) 檢視幫助資訊
2) 檢視歷史最高分
3) 建立遊戲物件, 開始遊戲
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" % cls.top_score)
def start_game(self):
print("%s 開始遊戲了..." % self.player_name)
# 1. 檢視遊戲的幫助資訊
Game.show_help()
# 2. 檢視歷史最高分
Game.show_top_score()
# 3. 建立遊戲物件
game = Game("小明")
game.start_game()
案例小結
- 例項方法 ---- 方法內部需要訪問 例項屬性
例項方法 內部可以使用 類名. 訪問類屬性 - 類方法 ---- 方法內部 只 需要訪問 類屬性
- 靜態方法 ---- 方法內部, 不需要訪問 例項屬性 和 類屬性
提問
如果方法內部 既需要訪問 例項屬性, 又需要訪問 類屬性, 應該定義什麼方法?
答案
- 例項方法
- 因為, 類只有一個, 在 例項方法 內部可以使用 類名. 訪問類屬性