天天看點

python面向對象程式設計——類屬性和類方法

1. 類是一個特殊的對象

​Python​

​ 中 一切皆對象:
  • ​class AAA:​

    ​ 定義的類屬于類對象
  • ​obj1 = AAA()​

    ​ 屬于執行個體對象
  • 在程式運作時,類同樣會被加載到記憶體
  • 在​

    ​Python​

    ​ 中,類是一個特殊的對象 ——類對象
  • 在程式運作時,類對象在記憶體中隻有一份,使用一個類可以建立出很多個對象執行個體
  • 除了封裝執行個體的屬性和方法外,類對象還可以擁有自己的屬性和方法

    1.類屬性

    2.類方法

  • 通過類名.的方式可以通路類的屬性或者調用類的方法
python面向對象程式設計——類屬性和類方法

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​

  1. 通過類名.調用類方法,調用方法時,不需要傳遞​

    ​cls​

    ​ 參數
  2. 在方法内部
  • 可以通過​

    ​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 總結

  1. 執行個體方法 —— 方法内部需要通路 執行個體屬性
  2. 類方法 —— 方法内部 隻 需要通路 類屬性
  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()