Python 装饰器完全指南:从原理到实战应用
什么是装饰器?
装饰器(Decorator)是 Python 中一个非常强大的功能,它允许你在不修改原函数代码的情况下,为函数添加额外的功能。装饰器本质上是一个接受函数作为参数,并返回一个新函数的高阶函数。
装饰器的应用场景非常广泛:日志记录、性能计时、权限验证、缓存、重试机制等都可以通过装饰器优雅地实现。
函数装饰器的基础
让我们从一个最简单的例子开始。假设我们想在执行函数前后打印一些信息:
def simple_decorator(func):\n def wrapper():\n print("执行函数前...")\n func()\n print("执行函数后...")\n return wrapper\n\n@simple_decorator\ndef say_hello():\n print("Hello, World!")\n\n# 调用函数\nsay_hello()\n输出结果:
执行函数前...\nHello, World!\n执行函数后...\n这里的关键是:@simple_decorator 语法糖实际上是 say_hello = simple_decorator(say_hello) 的简写形式。
处理带参数的函数
上面的简单装饰器只能处理无参数的函数。如果原函数有参数,我们需要用 *args 和 **kwargs 来传递任意参数:
def log_decorator(func):\n def wrapper(*args, **kwargs):\n print(f"调用函数: {func.__name__}")\n print(f"参数: args={args}, kwargs={kwargs}")\n result = func(*args, **kwargs)\n print(f"返回值: {result}")\n return result\n return wrapper\n\n@log_decorator\ndef add_numbers(a, b, multiplier=1):\n return (a b) * multiplier\n\nresult = add_numbers(3, 5, multiplier=2)\n输出结果:
调用函数: add_numbers\n参数: args=(3, 5), kwargs={multiplier: 2}\n返回值: 16\n带参数的装饰器
有时候我们需要装饰器本身接受参数。这需要再嵌套一层函数:
def repeat_decorator(times):\n def decorator(func):\n def wrapper(*args, **kwargs):\n results = []\n for _ in range(times):\n result = func(*args, **kwargs)\n results.append(result)\n return results\n return wrapper\n return decorator\n\n@repeat_decorator(times=3)\ndef greet(name):\n return f"Hello, {name}!"\nugs = greet("Alice")\nprint(results)\n输出结果:
[Hello, 