装饰器解决什么问题
装饰器可以在不修改原函数主体的情况下增加日志、权限、计时和缓存等行为。它把通用逻辑放在包装函数中,让业务函数保持专注。
最小示例
下面的 timer 接收一个函数并返回新的 wrapper 函数。@timer 只是把 greet = timer(greet) 写得更简洁。
def timer(func):
def wrapper(*args, **kwargs):
print("开始执行")
return func(*args, **kwargs)
return wrapper
@timer
def greet(name):
return f"你好,{name}"
保留原函数信息
包装函数会默认覆盖原函数的名称和文档。使用 functools.wraps 可以复制这些元数据,方便调试和生成文档。
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper