博客 / 詳情

返回

Python 的內置函數 classmethod

Python 的內置函數 classmethod 是一個裝飾器,用於將類中的方法標記為類方法。類方法的特點是第一個參數始終是類本身(通常命名為 cls),而不是實例對象(self)。這種特性使得類方法可以在不創建類實例的情況下被調用,主要用於實現與類相關但不依賴於特定實例的操作。

基本語法

class MyClass:
    @classmethod
    def my_class_method(cls, arg1, arg2, ...):
        # 方法實現

主要特點

  1. 類作為第一個參數:類方法的第一個參數是類本身(cls),而不是實例對象(self)。
  2. 無需實例化:可以直接通過類名調用,不需要創建類的實例。
  3. 繼承行為:在子類中調用時,cls 參數會自動綁定到當前子類。

典型應用場景

  1. 替代構造函數:實現多個構造方法(類似其他語言中的工廠模式)。

    class Date:
        def __init__(self, year, month, day):
            self.year = year
            self.month = month
            self.day = day
        
        @classmethod
        def from_string(cls, date_str):
            year, month, day = map(int, date_str.split('-'))
            return cls(year, month, day)
    
    date = Date.from_string("2023-05-15")
  2. 類級別操作:處理與類相關的數據或狀態。

    class Employee:
        raise_amount = 1.04
        
        @classmethod
        def set_raise_amount(cls, amount):
            cls.raise_amount = amount
  3. 多態支持:在繼承體系中實現特定子類邏輯。

    class Animal:
        @classmethod
        def make_sound(cls):
            return "Generic animal sound"
    
    class Dog(Animal):
        @classmethod
        def make_sound(cls):
            return "Bark!"

與靜態方法的區別

  • 類方法接收 cls 參數,可以訪問和修改類狀態
  • 靜態方法(@staticmethod)不接收特殊參數,就像普通函數一樣

注意事項

  1. 類方法不能訪問實例屬性(因為沒有 self
  2. 當需要訪問類狀態但不依賴實例狀態時使用
  3. 在元類編程中常用於自定義類創建行為

通過合理使用 classmethod,可以編寫出更靈活、更具表達力的面向對象代碼。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.