# Python 中的 decorator、`@dataclass` 與 `@abstractmethod` 介紹 在大學的 Python 課程中,我幾乎沒學過 decorator,直到後來才發現這些語法糖在工程實務中非常常見。而像 `@dataclass` 甚至可以幫我們省下不少樣板程式碼。這篇文章就快速介紹三個常見的 Python 裝飾器用法:`@decorator`、`@dataclass`、以及 `@abstractmethod`。 --- ## 1️⃣ decorator: 改變函式行為的小魔法 **Decorator** 是 Python 的 Syntactic sugar,常用來包裝函式或方法,加上額外的功能,例如記錄 log、權限檢查、計時等等。 > 語法糖是由英國電腦科學家彼得·蘭丁發明的一個術語,意指這種語法對語言的功能沒有影響,但是更方便程式設計師使用。 ### 🔹 簡單範例 ```python def my_decorator(func): def wrapper(*args, **kwargs): print("執行前") result = func(*args, **kwargs) print("執行後") return result return wrapper @my_decorator def say_hello(): print("Hello!") say_hello() ``` ### 🧠 等價於: ```python say_hello = my_decorator(say_hello) ``` --- ## 2️⃣ @dataclass: 自動生成 __init__ 等方法 在撰寫資料類別時,常常要寫一堆 __init__、__repr__、__eq__ 等方法,超級無聊又重複。@dataclass 可以幫你自動生成這些樣板代碼! ### 🔹 範例: ```python from dataclasses import dataclass @dataclass class Person: name: str age: int p = Person(name="Alice", age=30) print(p) # 自動有漂亮的 __repr__ ``` ### 🧠 @dataclass 會自動生成: * `__init__` * `__repr__` * `__eq__` * `__hash__`(視情況而定) 如果你要自己定義 __post_init__(類似 constructor 後處理),也可以自訂。 --- ## 3️⃣ @abstractmethod: 強迫子類實作的方法 這是 Python 提供的抽象類別機制,使用 abc 模組,讓你建立「不能被直接實例化」的抽象類,並規定子類一定要實作某些方法。 ### 🔹 使用方式 ```python from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def speak(self): pass class Dog(Animal): def speak(self): print("Woof") # cat = Animal() # ❌ 會錯,不能直接實例化 dog = Dog() # ✅ 正確,因為實作了 speak() dog.speak() ``` ### ✅ 使用情境 * 設計框架時,先定義接口規範 * 確保所有子類都實作必要功能 * 搭配 `@classmethod` 也能定義抽象 class method --- ### 結語 `@decorator`、`@dataclass` 和` @abstractmethod` 是 Python 中很有用的進階語法,雖然在初學階段不常用到,但在實際工程開發中非常實用,能讓程式更簡潔、彈性、也更容易維護。這些特性也很適合用在設計 pattern、API 架構或資料處理上。