1. 程式人生 > >Python_從零開始學習_(41) 類屬性和類方法

Python_從零開始學習_(41) 類屬性和類方法

目錄

1.  類的結構

1.1  術語 ---- 例項

1.2  類是一個特殊的物件

2.  類屬性和例項屬性

2.1  概念和使用

2.2  屬性的獲取機制 (科普)

3.  類方法和靜態方法

3.1  類方法

3.2  靜態方法

3.3  方法綜合案例


1.  類的結構

1.1  術語 ---- 例項

  1. 使用面向物件開發,  第1步  是設計
  2. 使用 類名() 建立物件,  建立物件 
    的動作有兩步:

    1) 在記憶體中為物件 分配空間

    2) 呼叫初始化方法 __init__ 為 物件初始化
  3. 物件建立後,  記憶體 中就有了一個物件的 實實在在 的存在 ---- 例項

因此,  通常也會把:

  1. 創建出來的 物件 叫做 類 的 例項
  2. 建立物件的 動作 叫做 例項化
  3. 物件的屬相 叫做 例項屬性
  4. 物件呼叫的方法 叫做 例項方法

在程式執行時:

  1. 物件各自擁有自己的 例項屬性
  2. 呼叫物件方法,  可以通過 self
  • 訪問自己的屬性
  • 呼叫自己的方法

結論

  • 每一個物件 都有自己 獨立的記憶體空間. 儲存各自不同的屬性
  • 多個物件的方法.  在記憶體中只有一份,  在呼叫方法時,  需要把物件的引用 傳遞到方法內部

1.2  類是一個特殊的物件

Python 中一切皆物件:

  • class Person:  定義的類屬於 類物件
  • xiaoming = Person()  屬於 例項物件
  • 在程式執行時, 類 
    同樣 會被載入到記憶體
  • 在 Python 中, 類 是一個特殊的物件 ---- 類物件
  • 在程式執行時, 類物件 在記憶體中 只有一份,  使用 一個類 可以穿檢出 很多個物件例項
  • 除了封裝 例項 的 屬性 和 方法 外. 類物件 還可以擁有自己的 屬性 和 方法
  1. 類屬性
  2. 類方法
  • 通過 類名. 的方式可以 訪問類的屬性 或者 呼叫類的方法

 

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 中 屬性的獲取 存在一個 向上查詢機制

  • 因此,  要訪問類屬性有兩種方式:
  1. 類名.類屬性
  2. 物件.類屬性 (不推薦)

注意

  • 如果使用 物件.類屬性 = 值 賦值語句,  只會 給物件新增一個屬性, 而不會影響到 類屬性的值

 

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  方法綜合案例

需求

  1. 設計一個 Game 類
  2. 屬性:

    定義一個 類屬性 top_score 記錄遊戲的 歷史最高分

    定義一個 例項屬性 player_name 記錄 當前遊戲的玩家姓名
  3. 方法:

    靜態方法 show_help 顯示遊戲幫助資訊

    類方法 show_top_score 顯示歷史最高分

    例項方法 start_game 開始當前玩家的遊戲
  4. 主程式步驟

    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()

 案例小結

  1. 例項方法 ---- 方法內部需要訪問 例項屬性

      例項方法 
    內部可以使用 類名. 訪問類屬性
  2. 類方法 ---- 方法內部 需要訪問 類屬性
  3. 靜態方法 ---- 方法內部,  不需要訪問 例項屬性 和 類屬性

提問

如果方法內部 既需要訪問 例項屬性,  又需要訪問 類屬性,  應該定義什麼方法?

答案

  • 例項方法
  • 因為, 類只有一個, 在 例項方法 內部可以使用 類名. 訪問類屬性