函数装饰器是Python中通过闭包和语法糖为函数添加功能的技术,使用@符号将装饰器应用于目标函数,等价于将原函数作为参数传入装饰器并接收返回的新函数。装饰器内部通常包含一个包装函数(wrapper),用于在原函数执行前后插入额外逻辑,如日志、计时或权限校验。对于带参数的函数,装饰器需使用args和*kwargs适配任意参数形式;若装饰器自身需接收参数,则采用三层嵌套结构:最外层接收装饰器参数,中间层接收被装饰函数,内层执行包装逻辑并返回结果。典型应用包括计时、缓存、日志记录等,本质是利用函数可作为参数传递和闭包特性实现横切关注点的模块化处理。

函数装饰器是Python中一种非常实用的语法糖,它允许我们在不修改原函数代码的前提下,为函数添加额外功能。装饰器的核心思想是把函数当作参数传递给另一个函数,并返回一个新的函数。
装饰器的基本结构
一个简单的装饰器是一个接受函数作为参数的函数,通常内部还定义了一个包装函数(wrapper),用来扩展原函数的行为。
例如:
def my_decorator(func):
def wrapper():
print("调用函数前的操作")
func()
print("调用函数后的操作")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
输出结果会是:
调用函数前的操作
Hello!
调用函数后的操作
这里 @my_decorator 等价于 say_hello = my_decorator(say_hello),这就是装饰器的应用过程:先定义装饰器,再通过 @ 符号应用到目标函数上。
立即学习“Python免费学习笔记(深入)”;
带参数的装饰器
如果被装饰的函数本身有参数,包装函数也需要接收这些参数。
def my_decorator(func):
def wrapper(*args, **kwargs):
print("函数开始执行")
result = func(*args, **kwargs)
print("函数执行结束")
return result
return wrapper
@my_decorator
def add(a, b):
return a + b
print(add(3, 5))
使用 *args 和 **kwargs 可以让装饰器适配任意参数形式的函数,提升通用性。
装饰器自身带参数
有时候我们希望控制装饰器的行为,这就需要在装饰器外层再套一层函数。
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet():
print("Hi!")
greet()
这个例子中,repeat(3) 先被调用,返回真正的装饰器 decorator,然后再作用于 greet 函数。这种三层嵌套结构是带参装饰器的标准写法。
实际应用场景
装饰器广泛用于以下场景:
- 日志记录:在函数执行时自动输出日志信息
- 性能测试:统计函数运行时间
- 权限校验:检查用户是否有调用权限
- 缓存机制:对结果进行缓存避免重复计算
比如一个简单的计时装饰器:
import timedef timer(func): def wrapper(*args, *kwargs): start = time.time() result = func(args, **kwargs) end = time.time() print(f"{func.name} 执行耗时: {end - start:.4f}s") return result return wrapper
@timer def slow_function(): time.sleep(1)
slow_function()
基本上就这些。装饰器的本质就是函数闭包加语法糖,理解其执行顺序和作用机制后,就能灵活运用于各种开发场景中。关键在于明白 @ 符号只是替代了手动赋值的过程,逻辑始终清晰可追踪。











