Python 面向對象6: 類屬性、類方法、靜態方法

一、總體目錄

  • 1.1、類的結構
  • 1.2、類屬性和實例屬性
  • 1.3、類方法和靜態方法

二、類的結構

  • 2.1、術語 -實例

    • 使用面相對象開發,第 1 步 是設計 類

    • 使用 類名() 創建對象,創建對象 的動作有兩步:

      • (1) 在內存中為對象 分配空間

      • (2) 調用初始化方法 __init__ 為 對象初始化
        對象創建后,內存 中就有了一個對象的 實實在在 的存在 — 實例

        • 創建出來的 對象 叫做 類 的 實例
        • 創建對象的 動作 叫做 實例化
        • 對象的屬性 叫做 實例屬性
        • 對象調用的方法 叫做 實例方法
    • 在程序執行時

      • 對象各自擁有自己的 實例屬性
      • 調用對象方法,可以通過 self.

    結論

    • 每一個對象 都有自己 獨立的內存空間,保存各自不同的屬性
    • 多個對象的方法,在內存中只有一份,在調用方法時,需要把對象的引用 傳遞到方法內部
  • 2.2 類是一個特殊的對象

    Python 中 一切皆對象:

    • class AAA: 定義的類屬于 類對象
    • obj1 = AAA() 屬于 實例對象
    • 在程序運行時, 同樣 會被加載到內存

    • 在 Python 中, 是一個特殊的對象 —— 類對象

    • 在程序運行時,類對象 在內存中 只有一份,使用 一個類 可以創建出 很多個對象實例

    • 除了封裝 實例屬性方法外,類對象 還可以擁有自己的 屬性方法

      • 類屬性
      • 類方法
      • 通過 類名. 的方式可以 訪問類的屬性 或者 調用類的方法
        類的結構示意圖

三、類屬性 和 實例屬性

  • 3.1 概念和使用

    • 類屬性 就是給 類對象 中定義的 屬性

    • 通常用來記錄 與這個類相關 的特征

    • 類屬性 不會用于記錄 具體對象的特征

    • 如下例子,定義一個 類屬性 count,記錄創建類的個數

      class Tool(object):
            # 使用賦值語句,定義類屬性,記錄創建工具對象的總數
            count = 0
      
            def __init__(self,name):
                  # 針對類屬性做一個計數+1
                  Tool.count += 1
                  self.name = name
      # 創建工具對象
      tool1 = Tool("斧頭")
      tool2 = Tool("鐮刀")
      # 知道使用 Tool 類到底創建了多少個對象?
      print("工具的數量是 %d"%Tool.count)
      
    • 類屬性的創建:在類的下面使用賦值語句,等號左邊是類屬性的名字,右邊是類屬性的初始值 ;使用是:類名.屬性名, 如上面的 count

  • 3.2、屬性的獲取機制- 向上查找機制

    • 在 Python 中 屬性的獲取 存在一個 向上查找機制(下面代碼 Tool.count 與 tool2.count)

      class Tool(object):
            # 使用賦值語句,定義類屬性,記錄創建工具對象的總數
            count = 0
      
            def __init__(self,name):
                # 針對類屬性做一個計數+1
                Tool.count += 1
                self.name = name
      # 創建 工具對象
      tool1 = Tool("斧頭")
      tool2 = Tool("鐮刀")
      # 知道使用 Tool 類到底創建了多少個對象?
      # print("工具的數量是 %d"%Tool.count) 
      print("工具的數量是 %d"% tool2.count)
      
    • 說明查找機制:首先上面的代碼 tool2.count,tools這個對象是沒有count 這個屬性的,這時候就會去類的屬性里面去找有沒有 count,如果類里面也沒有的話就報錯

    • 由上面可知,要訪問類屬性有兩種方式:

      • 類名.類屬性
      • 對象.類屬性 (不推薦)
    • 注意:如果使用 對象.類屬性 = 值 賦值語句,只會 給對象添加一個屬性,而不會影響到 類屬性的值

      如上面的代碼修改后(tool2.count就不靠譜了,僅僅是為 tool2添加了一個屬性而已)

       # 創建 工具對象
       tool1 = Tool("斧頭")
       tool2 = Tool("鐮刀")
       # 知道使用 Tool 類到底創建了多少個對象?
       print("工具的數量是 %d"%Tool.count) 
       tool2.count = 100
       print("工具的數量是 %d"% tool2.count)
      

四、類方法 和 靜態方法

  • 4.1、類方法

    • 類屬性 就是針對 類對象 定義的屬性

      • 使用 賦值語句class 關鍵字下方可以定義 類屬性
      • 類屬性 用于記錄 與這個類相關 的特征
    • 類方法 就是針對 類對象 定義的方法

      • 類方法 內部可以直接訪問 類屬性 或者調用其他的 類方法
    • 語法如下

      @classmethod
            def 類方法名(cls):
                 pass
      
      • 類方法需要用 修飾器 @classmethod 來標識, 告訴解釋器這是一個類方法
      • 類方法的 第一個參數 應該是 cls
        • 哪一個類 調用的方法,方法內的 cls 就是 哪一個類的引用
        • 這個參數和 實例方法 的第一個參數是 self 類似
        • 提示 使用其他名稱也可以,不過習慣使用 cls
      • 通過 類名. 調用 類方法,調用方法時,不需要傳遞 cls 參數
      • 在方法內部
        • 可以通過 cls. 訪問類的屬性
        • 也可以通過 cls. 調用其他的類方法

      在類方法內部,可以直接使用 cls 訪問 類屬性 或者 `調用類方法

  • 4.2、類方法定義以及使用的案例

    需求:定義一個Person類,定義一個類屬性:name,類方法:run 跑步,在類方法 run 里面打印類屬性 name

    class Person(object):
    
           name = ""
          
          @classmethod
          def run(cls):
    
               print("%s 會跑"%cls.name)
    
    Person.name = "小米"
    Person.run()
    
  • 4.3、靜態方法

    • 在開發時,如果需要在 中封裝一個方法,這個方法:

      • 不需要 訪問 實例屬性 或者調用 實例方法
      • 不需要 訪問 類屬性 或者調用 類方法
    • 語法如下(不需要任何參數的)

      @staticmethod
      def 靜態方法名():
            pass
      
    • 靜態方法 需要用 修飾器 @staticmethod 來標識,告訴解釋器這是一個靜態方法

    • 通過 類名. 調用 靜態方法

    • 實例:

      class Baby(object):
      
          @staticmethod
          def cry():
      
              # 不需要訪問實例屬性也不需要訪問類屬性的方法
              print("小孩在哭...")
      Baby.cry()
      

五、綜合案例

  • 5.1、需求

    • (1)、設計一個 Game 類,模擬 吃雞游戲
    • (2)、屬性:
      • 定義一個 類屬性 top_score 記錄游戲的 歷史最高分
      • 定義一個 實例屬性 player_name 記錄 當前游戲的玩家姓名
    • (3)、方法:
      • 靜態方法 show_help 顯示游戲幫助信息
      • 類方法 show_top_score 顯示歷史最高分
      • 實例方法 start_game 開始當前玩家的游戲
    • (4)、主程序步驟
      • 查看幫助信息

      • 查看歷史最高分

      • 創建游戲對象,開始游戲

        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 = 10000
        
        # 1. 查看游戲幫助
        Game.show_help()
        
        # 2. 查看游戲最高分
        Game.show_top_score()
        
        # 3. 創建游戲對象,開始游戲
        game = Game("二郎神")
        
        game.start_game()
        
        # 4. 游戲結束,查看游戲最高分
        Game.show_top_score()
        
  • 5.2、總結

    • 實例方法 —— 方法內部需要訪問 實例屬性
      • 實例方法 內部可以使用 類名. 訪問類屬性
    • 類方法 —— 方法內部 需要訪問 類屬性
    • 靜態方法 —— 方法內部,不需要訪問 實例屬性類屬性
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容