Python 裝飾器:包裝和修改函數
學習 Python 裝飾器來動態修改函數行為。了解包裝器函數、@ 語法以及處理裝飾器中的參數。
概述
裝飾器是 Python 最優雅、最強大的設計模式之一。它們允許開發人員修改或擴展函數、方法或類別的行為,而無需永久更改其原始程式碼。將裝飾器視為將一個函數包裝在另一個函數中以執行預處理和後處理步驟。這使得裝飾器非常適合實現橫切關注點,例如日誌記錄、計時、驗證或存取控制。
從本質上講,裝飾器之所以起作用,是因為 Python 函數是一等公民。這意味著函數可以作為參數傳遞給其他函數、從函數返回以及分配給變數。裝飾器只是一個函數,它接受另一個函數作為參數,定義一個巢狀的包裝函數,該函數執行原始函數以及一些額外的邏輯,並傳回此包裝函數以取代原始函數。
為了使裝飾器的應用變得簡單和乾淨,Python 提供了「@decorator_name」語法糖,將其放置在目標函數定義的正上方。當呼叫修飾函數時,Python 會呼叫包裝器。如果函數接受參數,則包裝器必須接受任意參數(“*args”和“**kwargs”)並正確轉發它們。了解裝飾器使您能夠編寫高度模組化、乾淨且 DRY(不要重複自己)的程式碼。
程式碼和執行輸出
一個自訂裝飾器,用於追蹤和記錄函數執行細節。
decorators.py
在編輯器中嘗試def call_tracker(func):
"""Decorator that tracks and logs function execution details."""
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with args: {args}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned: {result}")
return result
return wrapper
@call_tracker
def multiply(a, b):
return a * b
# Calling the decorated function
result = multiply(5, 4)端子輸出
Calling multiply with args: (5, 4)
multiply returned: 20逐步實施
- 將運行時指標記錄到效能監視器
- 對路由執行身份驗證和授權檢查
- 緩存或記憶昂貴的計算結果
常見問題解答
裝飾器如何處理參數?
透過在巢狀包裝函數中使用 *args 和 **kwargs,它允許它接收任何位置或關鍵字參數並將其轉發到包裝函數。
可以對一個函數套用多個裝飾器嗎?
是的,您可以堆疊它們。它們將從上到下(從最內層到最外層)的順序執行。
相關主題
推薦的 Python 資源
透過相關的互動式教學、備忘單和程式碼比較來擴展您的知識。