裝飾器是python中用于修改或增強函數行為的特殊函數,其核心原理基于高階函數特性。1.權限控制:通過login_required裝飾器統一處理用戶登錄驗證邏輯;2.日志記錄:使用log_call裝飾器自動打印函數調用信息;3.性能測試:利用timer裝飾器統計函數執行時間;4.緩存優化:通過lru_cache減少重復計算提高效率。這些應用使代碼更簡潔、復用性更高且易于維護。
裝飾器本質上是一個函數,用來修改其他函數或類的行為,而無需修改它們的源代碼。它的核心原理是利用了 python 的高階函數特性,把一個函數作為參數傳給另一個函數,然后返回一個新的函數。
裝飾器的典型應用場景包括權限校驗、日志記錄、性能測試、緩存機制等。下面從幾個常見場景出發,說明裝飾器的使用方式和背后邏輯。
權限控制:限制某些用戶訪問特定功能
在開發 Web 應用或者后臺系統時,經常需要判斷當前用戶是否有權限執行某個操作。這時候就可以用裝飾器統一處理權限邏輯。
立即學習“Python免費學習筆記(深入)”;
比如,寫一個簡單的 login_required 裝飾器:
def login_required(func): def wrapper(user, *args, **kwargs): if user.is_authenticated: return func(user, *args, **kwargs) else: print("請先登錄") return wrapper
然后在視圖函數上加上這個裝飾器:
@login_required def Access_profile(user): print(f"歡迎 {user.name}")
這樣就不需要每個函數里都寫一遍登錄判斷邏輯。這種做法讓業務邏輯更清晰,也更容易維護。
日志記錄:追蹤函數調用過程
很多程序都需要記錄函數被調用的時間、參數、結果等信息。裝飾器非常適合做這類“附加”工作。
可以寫一個簡單的日志裝飾器:
def log_call(func): def wrapper(*args, **kwargs): print(f"調用函數 {func.__name__},參數: {args}, {kwargs}") result = func(*args, **kwargs) print(f"{func.__name__} 返回值: {result}") return result return wrapper
使用起來也很方便:
@log_call def add(a, b): return a + b
運行 add(3, 5) 會自動打印出調用信息。這種方式對調試和監控很有幫助。
性能測試:統計函數執行時間
有時候想知道某段代碼運行多長時間,也可以用裝飾器來實現。
寫一個計時裝飾器:
import time def timer(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) duration = time.time() - start_time print(f"{func.__name__} 執行耗時: {duration:.4f} 秒") return result return wrapper
應用到任意函數上就能看到執行時間:
@timer def slow_function(): time.sleep(1)
緩存優化:減少重復計算
對于一些計算量大但輸入輸出固定的函數,可以用裝飾器緩存結果,避免重復執行。
Python 標準庫中的 functools.lru_cache 就是一個很好的例子:
from functools import lru_cache @lru_cache(maxsize=None) def fib(n): if n < 2: return n return fib(n-1) + fib(n-2)
這個裝飾器會把之前的調用結果緩存下來,下次遇到相同參數就直接返回結果,大大提升效率。
你也可以自己實現一個簡單版本的緩存裝飾器,理解其內部機制。
基本上就這些。裝飾器雖然看起來有點繞,但只要理解它本質是函數包裝的過程,用起來其實很自然。關鍵是在合適的地方使用,別濫用就行。