Python,十個(gè)高效有用的裝飾器
在 Python 編程領(lǐng)域,裝飾器是一種極具威力的工具,它如同為函數(shù)或類披上了一層神奇的 外衣,能夠在不修改原始代碼的前提下,巧妙地更改或強(qiáng)化其行為表現(xiàn)。
本質(zhì)上,裝飾器是一個(gè)函數(shù),它以其他函數(shù)或類作為輸入?yún)?shù),經(jīng)處理后返回一個(gè)新的函數(shù)或類。
在實(shí)際應(yīng)用中,我們只需在目標(biāo)函數(shù)或類之前添加 @ 符號(hào),即可快速便捷地應(yīng)用裝飾器。

接下來,開發(fā)常用的10種裝飾器示例代碼:
1. @timer
用于統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間,對(duì)性能分析極為有利,可迅速定位代碼中的性能瓶頸。
import time
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 耗時(shí): {end - start:.4f}s")
return result
return wrapper2. @debug
在調(diào)試過程中,該裝飾器可打印函數(shù)的參數(shù)及返回值,便于我們迅速找到問題根源。
def debug(func):
def wrapper(*args, **kwargs):
print(f"[DEBUG] {func.__name__} args: {args}, kwargs: {kwargs}")
result = func(*args, **kwargs)
print(f"[DEBUG] {func.__name__} returned: {result}")
return result
return wrapper3. @retry
當(dāng)網(wǎng)絡(luò)請(qǐng)求等操作失敗時(shí),此裝飾器能自動(dòng)進(jìn)行重試,有效增強(qiáng)程序的魯棒性。
def retry(max_attempts=3, delay=1):
def decorator(func):
def wrapper(*args, **kwargs):
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
print(f"Attempt {attempt + 1} failed: {e}")
time.sleep(delay)
raise Exception("Max retries exceeded")
return wrapper
return decorator4. @deprecated
用于標(biāo)記已過時(shí)的函數(shù),提醒用戶及時(shí)替換為新函數(shù)。
import warnings
def deprecated(func):
def wrapper(*args, **kwargs):
warnings.warn(f"{func.__name__} is deprecated", DeprecationWarning)
return func(*args, **kwargs)
return wrapper
return wrapper5. @permission
Web API 中,用于檢查用戶是否具備相應(yīng)的權(quán)限,如是否為 admin 角色。
def permission(perm):
def decorator(func):
def wrapper(user, *args, **kwargs):
if user.permission != perm:
raise PermissionError("Access denied")
return func(user, *args, **kwargs)
return wrapper
return decorator6. @validate
確保輸入數(shù)據(jù)符合預(yù)期的格式,如數(shù)據(jù)類型、范圍等,若不符合則拋出異常。
def validate(*validators):
def decorator(func):
def wrapper(*args, **kwargs):
for i, val in enumerate(args):
if not validators[i](val):
raise ValueError(f"Invalid argument: {val}")
return func(*args, **kwargs)
return wrapper
return decorator
return decorator7. @login
確保用戶已認(rèn)證登錄,防止未經(jīng)授權(quán)的操作。
def login(func):
def wrapper(user, *args, **kwargs):
if not user.is_authenticated:
raise Exception("User not logged in")
return func(user, *args, **kwargs)
return wrapper8. @log_results
將函數(shù)輸出持久化保存,方便后續(xù)查看函數(shù)運(yùn)行結(jié)果。
def log_results(filename):
def decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
with open(filename, "a") as f:
f.write(f"{func.__name__}: {result}\n")
return result
return wrapper
return decorator9. @rate_limit
限制 API 調(diào)用頻率,防范 DDoS 攻擊或 API 被濫用。
from redis import Redis
redis = Redis()
def rate_limit(key, limit=100, period=3600):
def decorator(func):
def wrapper(*args, **kwargs):
count = redis.get(key) or0
if int(count) >= limit:
raise Exception("API rate limit exceeded")
redis.incr(key, 1)
redis.expire(key, period)
return func(*args, **kwargs)
return wrapper
return decorator10. @singleton
確保一個(gè)類只有一個(gè)實(shí)例,在特定場(chǎng)景下非常有用。
def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper熟練掌握裝飾器的運(yùn)用,能夠極大簡(jiǎn)化開發(fā)流程,使代碼更加健壯可靠。在大型項(xiàng)目開發(fā)中,借助裝飾器實(shí)現(xiàn)關(guān)注點(diǎn)分離,如將日志記錄、權(quán)限管理等功能與核心業(yè)務(wù)邏輯分開處理,可顯著提升開發(fā)效率。

































