方法類型

  • 有些資料(屬性)與函式(方法)是類別本身的一部分,有些是「類型所建立的物件」的一部分
  • 當在「類別定義」裡面看到初始的 self 引數時,它是一個實例方法
    • 它們是在製作自己的類別時,經常編寫的方法類型
    • 實例方法的第一個參數是 self,當呼叫方法時,Python 會將物件傳給它

類別方法:會影響整個類別

  • 相較之下,類別方法會影響整個類別
    • 對類別所做的任何修改,都會影響它的所有物件
    • 在類別定義中,@classmethod 裝飾器說明接下來的函式是一個類別方法
  • 同樣的,方法的第一個參數是類別本身
    • 傳統上,Python 會將這個參數稱為 cls,因為 class 是保留字,不能在這裡使用

定義一個類別方法 → 用它來計算這個類別已經建立多少個物件實例

# 為 A 定義一個類別方法 → 用它來計算這個類別已經建立多少個物件實例
# 當在「類別定義」裡面看到初始的 self 引數時,它是一個「實例方法」→ 它們是在製作自己的類別時,經常編寫的方法類型

>>> class A():
    count = 0
    def __init__(self):       # 實例方法的第一個參數是 self,當呼叫方法時,Python 會將物件傳給它
        A.count += 1          # 注意,我們使用 A.count(類別屬性),而不是 self.count(物件實例屬性)
    def exclaim(self):
        print("I'm an A!")
    @classmethod              # 在類別定義中,@classmethod 裝飾器說明接下來的函式是一個類別方法
    def kids(cls):            # 傳統上,Python 會將這個參數稱為 cls,因為 class 是保留字,不能在這裡使用 ← 方法的第一個參數是類別本身
        print("A has", cls.count, "little objects.")

# 以下皆是3個物件實例(「A類別方法」建立「3個物件實例」)
>>> easy_a = A()
>>> breezy_a = A()
>>> wheezy_a = A()

# 在 kids() 方法中,我們使用 cls.count,但也可以使用 A.count
>>> A.kids()
A has 3 little objects.

靜態方法:不會影響類別與它的物件

  • 第三種類別定義式中的方法類型
    • 不會影響類別與它的物件
    • 它只是為了方便才待在那裡
    • 它是靜態方法,以 @staticmethod 裝飾器開頭 → 沒有原本的 self 或 class 參數

【範例】以下是 coyoteWeapon() 類別的廣告範例

# 注意:我們不需要建立 CoyoteWeapon 類別的物件,就可以存取這個方法 → 非常的類別

>>> class CoyoteWeapon():
    @staticmethod
    def commercial():
        print('This CoyoteWeapon has been brought to you by Acme')

>>> CoyoteWeapon.commercial()
This CoyoteWeapon has been brought to you by Acme

results matching ""

    No results matching ""