Python装饰器应用场景
Python装饰器本质上是一个函数,用于在不修改原函数的情况下,动态地为函数添加额外的功能。以下是装饰器的详细解析:
- 基本概念示例
def my_decorator(func):
def wrapper():
print("在函数调用前执行")
func() # 调用原始函数
print("在函数调用后执行")
return wrapper
@my_decorator
def say_hello():
print("Hello, World!")
# 等价于 say_hello = my_decorator(say_hello)
say_hello() # 输出会包含装饰器的额外操作
- 常见应用场景
a. 性能统计
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 运行耗时 {end_time - start_time} 秒")
return result
return wrapper
@timer
def slow_function():
time.sleep(2)
b. 权限验证
def login_required(func):
def wrapper(*args, **kwargs):
if not is_logged_in():
print("请先登录")
return None
return func(*args, **kwargs)
return wrapper
@login_required
def sensitive_operation():
print("执行敏感操作")
c. 日志记录
def logger(func):
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
print(f"参数: {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"返回结果: {result}")
return result
return wrapper
@logger
def add(a, b):
return a + b
- 带参数的装饰器
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(name):
print(f"Hello, {name}")
- 类装饰器
class CountCalls:
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print(f"Call {self.num_calls} of {self.func.__name__}")
return self.func(*args, **kwargs)
@CountCalls
def test_function():
print("Executing test function")
- 多个装饰器
@decorator1
@decorator2
def my_function():
pass
# 等价于 my_function = decorator1(decorator2(my_function))
装饰器的主要作用:
- 在不修改原函数的情况下添加功能
- 代码复用
- 解耦核心逻辑和周边功能
- 动态修改函数行为
适用场景:
- 性能监控
- 日志记录
- 权限控制
- 缓存
- 参数验证
- 事务管理
最佳实践:
- 使用
functools.wraps
保留原函数的元数据 - 避免过度使用
- 保持装饰器的单一职责
from functools import wraps
def my_decorator(func):
@wraps(func) # 保留原函数的元数据
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
装饰器是Python中非常灵活和强大的特性,可以大大简化代码,提高代码的可读性和可维护性。