Python 的內置函數 classmethod 是一個裝飾器,用於將類中的方法標記為類方法。類方法的特點是第一個參數始終是類本身(通常命名為 cls),而不是實例對象(self)。這種特性使得類方法可以在不創建類實例的情況下被調用,主要用於實現與類相關但不依賴於特定實例的操作。
基本語法
class MyClass:
@classmethod
def my_class_method(cls, arg1, arg2, ...):
# 方法實現
主要特點
- 類作為第一個參數:類方法的第一個參數是類本身(
cls),而不是實例對象(self)。 - 無需實例化:可以直接通過類名調用,不需要創建類的實例。
- 繼承行為:在子類中調用時,
cls參數會自動綁定到當前子類。
典型應用場景
-
替代構造函數:實現多個構造方法(類似其他語言中的工廠模式)。
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") -
類級別操作:處理與類相關的數據或狀態。
class Employee: raise_amount = 1.04 @classmethod def set_raise_amount(cls, amount): cls.raise_amount = amount -
多態支持:在繼承體系中實現特定子類邏輯。
class Animal: @classmethod def make_sound(cls): return "Generic animal sound" class Dog(Animal): @classmethod def make_sound(cls): return "Bark!"
與靜態方法的區別
- 類方法接收
cls參數,可以訪問和修改類狀態 - 靜態方法(
@staticmethod)不接收特殊參數,就像普通函數一樣
注意事項
- 類方法不能訪問實例屬性(因為沒有
self) - 當需要訪問類狀態但不依賴實例狀態時使用
- 在元類編程中常用於自定義類創建行為
通過合理使用 classmethod,可以編寫出更靈活、更具表達力的面向對象代碼。