類的裝飾器
知識點回顧
- 類的裝飾器
- 裝飾器思想的進一步理解:外部修改、動態
- 類方法的定義:內部定義和外部定義
回顧一下,函數的裝飾器是 :接收一個函數,返回一個修改后的函數。類也有修飾器,類裝飾器本質上確實是一個函數,他的邏輯類似,接收一個類,返回一個修改后的類或者新類。通過類裝飾器,可以在不修改類內部代碼的情況下,為多個類統一添加功能(如日志、統計),類裝飾器有兩種常見實現方式:
- 直接修改類(添加新的方法或屬性,修改原有方法比如構造方法)
- 使用 wrapper() 返回新類(更接近函數裝飾器模式)
# 方式1:直接修改類
def decorator1(cls):cls.new_attr = 'value' # 直接添加屬性return cls # 返回原類# 方式2:使用wrapper(類似函數裝飾器)
def decorator2(cls):class Wrapper(cls): # 創建子類new_attr = 'value'return Wrapper
舉個具體例子來看看,這是直接修改類
# 定義類裝飾器:為類添加日志功能
def class_logger(cls):# 保存原始的 __init__ 方法original_init = cls.__init__def new_init(self, *args, **kwargs):# 新增實例化日志print(f"[LOG] 實例化對象: {cls.__name__}")original_init(self, *args, **kwargs) # 調用原始構造方法# 將類的 __init__ 方法替換為新方法cls.__init__ = new_init# 為類添加一個日志方法(示例)def log_message(self, message):print(f"[LOG] {message}")cls.log = log_message # 將方法綁定到類,這是一種將外部函數添加為類的屬性的方法return cls# 定義簡單打印類,應用裝飾器
# 同樣是語法糖的寫法
@class_logger
class SimplePrinter:def __init__(self, name):self.name = name # 構造方法:初始化名稱def print_text(self, text):"""簡單打印方法"""print(f"{self.name}: {text}")# 使用示例
printer = SimplePrinter("Alice") # 實例化時觸發裝飾器的日志
printer.print_text("Hello, World!") # 調用普通方法
printer.log("這是裝飾器添加的日志方法") # 調用裝飾器新增的方法# 輸出:[LOG] 實例化對象: SimplePrinter
# 輸出:Alice: Hello, World!
# 輸出:[LOG] 這是裝飾器添加的日志方法
第二種用 wrapper() 封裝返回的方法就不談了,之前函數裝飾器接觸過
收獲心得:
學了這么多天,感覺python就是萬物皆可類,類又有屬性和方法,跟原先的C語言學習比起來,從數據結構、從函數或者類的復用、封裝、動態修改等方面更進一步有了不同
@浙大疏錦行