1. 類是一個特殊的對象
中 一切皆對象:
Python
-
定義的類屬于類對象
class AAA:
-
屬于執行個體對象
obj1 = AAA()
- 在程式運作時,類同樣會被加載到記憶體
- 在
中,類是一個特殊的對象 ——類對象Python
- 在程式運作時,類對象在記憶體中隻有一份,使用一個類可以建立出很多個對象執行個體
-
除了封裝執行個體的屬性和方法外,類對象還可以擁有自己的屬性和方法
1.類屬性
2.類方法
- 通過類名.的方式可以通路類的屬性或者調用類的方法
2. 類屬性和執行個體屬性
2.1 概念和使用
- 類屬性就是給類對象中定義的屬性
- 通常用來記錄與這個類相關的特征
- 類屬性不會用于記錄具體對象的特征
class Tool:
# 使用指派語句,定義類屬性,記錄建立工具對象的總數
count = 0
def __init__(self, name):
self.name = name
# 針對類屬性做一個計數+1
Tool.count += 1
# 建立工具對象
tool1 = Tool("哈哈")
tool2 = Tool("嘿嘿")
tool3 = Tool("哆哆")
# 知道使用 Tool 類到底建立了多少個對象?
print("現在建立了 %d 個工具" % Tool.count)
2.2 屬性的擷取機制
- 在
中 屬性的擷取 存在一個 向上查找機制Python
-
是以,要通路類屬性有兩種方式:
1.類名.類屬性
2.對象.類屬性 (不推薦)
注意
- 如果使用
指派語句,隻會給對象添加一個屬性,而不會影響到類屬性的值對象.類屬性 = 值
3. 類方法和靜态方法
3.1 類方法
- 類屬性就是針對類對象定義的屬性
- 使用指派語句在
關鍵字下方可以定義類屬性class
- 類屬性用于記錄與這個類相關的特征
- 類方法就是針對類對象定義的方法
- 在類方法内部可以直接通路類屬性或者調用其他的類方法
文法如下
@classmethod
def 類方法名(cls):
pass
- 類方法需要用修飾器
來辨別,告訴解釋器這是一個類方法@classmethod
- 類方法的第一個參數應該是
cls
- 由哪一個類調用的方法,方法内的
就是哪一個類的引用cls
- 這個參數和執行個體方法的第一個參數是
類似self
- 提示使用其他名稱也可以,不過習慣使用
cls
- 通過類名.調用類方法,調用方法時,不需要傳遞
參數cls
- 在方法内部
- 可以通過
通路類的屬性cls.
- 也可以通過
調用其他的類方法cls.
在類方法内部,可以直接使用
cls
通路 類屬性 或者 調用類方法
3.2 靜态方法
- 在開發時,如果需要在類 中封裝一個方法,這個方法:
- 既不需要通路執行個體屬性或者調用執行個體方法
- 也不需要通路類屬性或者調用類方法
- 這個時候,可以把這個方法封裝成一個靜态方法 ,一般可以為“”遊戲幫助“”
文法如下
@staticmethod
def 靜态方法名():
pass
- 靜态方法需要用修飾器
來辨別,告訴解釋器這是一個靜态方法@staticmethod
- 通過類名.調用靜态方法
class Dog:
# 狗對象計數
count = 0
@staticmethod
def run():
# 不需要通路執行個體屬性也不需要通路類屬性的方法
print("小狗在跑...")
def __init__(self, name):
self.name =
3.3 總結
- 執行個體方法 —— 方法内部需要通路 執行個體屬性
- 類方法 —— 方法内部 隻 需要通路 類屬性
- 靜态方法 —— 方法内部,不需要通路 執行個體屬性 和 類屬性
提問
- 應該定義執行個體方法
- 因為,類隻有一個,在執行個體方法内部可以使用類名.通路類屬性
## 案例
class Game(object):
# 遊戲最高分,類屬性
top_score = 0
@staticmethod
def show_help():
print("遊戲幫助說明")
@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] 玩家請開始遊戲..." % self.player_name)
# 使用類名.修改曆史最高分
Game.top_score = 99
# 1. 檢視遊戲幫助
Game.show_help()
# 2. 檢視遊戲最高分
Game.show_top_score()
# 3. 建立遊戲對象,開始遊戲
game = Game("小花")
game.start_game()
# 4. 遊戲結束,檢視遊戲最高分
Game.show_top_score()