先从闭包说起
在理解装饰器之前,必须先理解闭包。闭包是指一个函数记住了其外部作用域的变量,即使外部函数已经执行完毕。
def outer(x):
def inner(y):
return x + y
return inner
add_5 = outer(5)
print(add_5(3)) # 8
装饰器基础
装饰器本质上是一个接受函数作为参数并返回新函数的高阶函数:
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} took {time.time() - start:.4f}s")
return result
return wrapper
@timer
def slow_function():
time.sleep(1)
slow_function()
带参数的装饰器
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def greet():
print("Hello!")
greet() # 打印三次 Hello!
总结
装饰器是 Python 函数式编程特性的集大成者,在日志记录、性能监控、权限校验等场景中有着广泛应用。
Pythonista 写得很清晰,终于搞懂了带参装饰器
2026-05-20 18:00