首頁 >後端開發 >Python教學 >Python 裝飾器:簡化程式碼

Python 裝飾器:簡化程式碼

Susan Sarandon
Susan Sarandon原創
2024-09-26 06:26:42755瀏覽

Python Decorators: Simplifying Code

Python 中的裝飾器是一個強大的工具,它允許您修改函數或方法的行為,而無需更改其原始程式碼。它們提供了一種添加功能的簡潔方法,並廣泛用於日誌記錄、執行規則和優化效能。

在這篇文章中,我們將透過簡單的範例來了解六種常見的 Python 裝飾器。

1 - @staticmethod: 定義靜態方法

@staticmethod 裝飾器建立不存取實例(self)或類別(cls)資料的方法。它的行為類似於常規函數,但可以從類別或實例中呼叫。

範例:

class MyClass:
    @staticmethod
    def greet():
        return "Hello from static method!"

2 - @classmethod: 定義類別方法

@classmethod 裝飾器可讓您定義以類別 (cls) 作為第一個參數的方法。這對於工廠方法或更改類別狀態很有用。

範例:

class MyClass:
    count = 0

    @classmethod
    def increment_count(cls):
        cls.count += 1

3 - @property: 定義唯讀屬性

@property 裝飾器允許像屬性一樣存取方法。當您想要控制對屬性的存取而不暴露內部實作時,它非常有用。

範例:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def area(self):
        return 3.14 * self._radius ** 2

4 - @functools.lru_cache:快取昂貴的函數結果

@lru_cache 裝飾器(來自 functools)快取函數呼叫的結果以避免重新計算。這可以顯著提高昂貴或頻繁調用的函數的效能。

範例:

from functools import lru_cache

@lru_cache(maxsize=32)
def expensive_computation(x):
    return x ** 2

5 - @functools.wraps:在自訂裝飾器中保留元資料

編寫自訂裝飾器時,@wraps 裝飾器會保留原始函數的元資料(名稱、文件字串),確保內省工具仍然有效。

範例:

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

6 - @dataclass:簡化類別定義

@dataclass 裝飾器(來自 dataclasses 模組)自動為類別產生 init() 和 repr() 等方法。它非常適合資料保存類別。

範例:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

結論

@staticmethod、@classmethod、@property、@lru_cache、@wraps 和 @dataclass 等 Python 裝飾器透過將功能包裝在方法和函數周圍,幫助編寫更乾淨、更有效率的程式碼。它們是多功能工具,可以簡化許多程式設計任務。

來源

Python 裝飾器定義
@靜態方法
@classmethod
@屬性
@functools.lru_cache
@functools.wraps
@資料類別

以上是Python 裝飾器:簡化程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn