装饰器解决什么问题

装饰器可以在不修改原函数主体的情况下增加日志、权限、计时和缓存等行为。它把通用逻辑放在包装函数中,让业务函数保持专注。

最小示例

下面的 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