Python 装饰器
Python 装饰器 · 难度:高级 · +15XP
Python 装饰器
装饰器(Decorator)是Python中一个强大的函数增强工具,可以在不修改原函数代码的前提下,为函数添加额外的功能(如日志、计时、权限检查)。装饰器本质上是一个接收函数并返回新函数的高阶函数。
基本概念
# 装饰器就是一个函数,接收函数,返回函数
def my_decorator(func):
def wrapper():
print("函数执行前...")
func()
print("函数执行后...")
return wrapper
@my_decorator # 等价于:greet = my_decorator(greet)
def greet():
print("你好,世界!")
greet()
# 输出:
# 函数执行前...
# 你好,世界!
# 函数执行后...
带参数的装饰器
import time
def timer(func):
"""测量函数执行时间的装饰器"""
import functools
@functools.wraps(func) # 保留原函数的元信息
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行耗时:{end - start:.4f}秒")
return result
return wrapper
@timer
def slow_add(n):
"""计算1到n的累加和"""
return sum(range(1, n + 1))
print(slow_add(1000000))
# 输出:
# slow_add 执行耗时:0.0487秒
# 500000500000
装饰器带参数
def repeat(times):
"""重复执行函数的装饰器"""
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for _ in range(times):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3) # 调用3次
def say_hello():
print("Hello!")
# 输出三行 Hello!
常见实用装饰器
| 装饰器 | 用途 |
|---|---|
@staticmethod | 定义静态方法(不需要self参数) |
@classmethod | 定义类方法(第一个参数是cls) |
@property | 把方法变成属性访问 |
@functools.lru_cache | 缓存函数返回值(加速递归) |
@dataclass | 自动生成类的__init__等方法 |
实战练习
- 写一个装饰器,在函数执行前后打印一条横线分隔符
- 写一个装饰器,把函数的返回值翻倍(只对数字类型生效)
- 用@timer装饰器对比for循环和列表推导式的性能
- 写一个装饰器限制函数调用频率(比如1秒内只能调用1次)