Python 装饰器
装饰器是 Python 的语法糖,用于在不修改原函数代码的情况下扩展函数行为。
基本装饰器
python
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} 耗时: {time.time() - start:.4f}s")
return result
return wrapper
@timer
def slow_function():
import time
time.sleep(1)
slow_function() # slow_function 耗时: 1.0012s@timer 等价于 slow_function = timer(slow_function)。
functools.wraps
保留原函数的元信息:
python
from functools import wraps
def timer(func):
@wraps(func) # 保留 __name__, __doc__ 等
def wrapper(*args, **kwargs):
# ...
return func(*args, **kwargs)
return wrapper带参数的装饰器
python
def repeat(n):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
for _ in range(n):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("Tom") # 打印 3 次类装饰器
python
class CountCalls:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print(f"调用次数: {self.count}")
return self.func(*args, **kwargs)
@CountCalls
def say_hello():
print("Hello!")常用内置装饰器
python
class MyClass:
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value装饰器叠加
从下往上包装,从上往下执行:
python
@decorator_a
@decorator_b
def func():
pass
# 等价于
func = decorator_a(decorator_b(func))实用示例
python
from functools import wraps
import time
# 缓存
def memoize(func):
cache = {}
@wraps(func)
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
# 重试
def retry(max_attempts=3, delay=1):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
if attempt == max_attempts - 1:
raise
time.sleep(delay)
return wrapper
return decorator