什么是装饰器?
装饰器是 Python 中的一个重要概念,它可以在不修改被装饰函数的源代码的情况下,为函数添加额外的功能。装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数。新的函数在执行时会先执行装饰器函数中的代码,然后再执行被装饰函数的代码。
例:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("函数执行前")
result = func(*args, **kwargs)
print("函数执行后")
return result
return wrapper
# 定义一个被装饰的函数
@my_decorator
def my_function(x, y):
return x + y
# 调用被装饰的函数
result = my_function(1, 2)
print("结果:", result)
解析:
定义一个名为 my_decorator 的装饰器函数,它接收一个函数作为参数,并返回一个新的函数 wrapper 。
在 wrapper 函数中,首先打印一条消息"函数执行前",然后调用被装饰的函数 func ,并将结果存储在变量 result 中。
最后,打印一条消息"函数执行后",并返回结果 result 。
使用 @my_decorator 装饰器来装饰一个名为 my_function 的函数。
当调用 my_function 函数时,实际上是在调用 wrapper 函数, wrapper 函数会先执行装饰器函数中的代码,然后再执行被装饰函数 my_function 的代码。
在实际应用中使用装饰器来提高代码可读性和可维护性的方法:
1. 功能分离:将特定的、独立的功能提取到装饰器中,使主函数代码更专注于核心业务逻辑,让代码结构更清晰。
def print_info_decorator(func):
def wrapper(*args, **kwargs):
print("开始执行函数")
func(*args, **kwargs)
print("函数执行完毕")
return wrapper
@print_info_decorator
def do_something():
print("正在做某事")
do_something()
2. 权限控制:通过装饰器来实现对某些函数的访问权限检查,使得权限管理逻辑集中且易于理解和修改。
def has_permission(permission_level):
def decorator(func):
def wrapper(*args, **kwargs):
if user_has_permission(permission_level): # 模拟权限检查
func(*args, **kwargs)
else:
print("无权执行")
return wrapper
return decorator
@has_permission("admin")
def admin_task():
print("执行管理员任务")
# 假设用户没有相应权限
admin_task()
3. 日志记录:利用装饰器方便地添加日志记录功能,而无需在每个函数中重复编写相关代码。
import time
def log_execution_time(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
@log_execution_time
def long_running_task():
time.sleep(2)
long_running_task()
4. 性能监控:可以用装饰器来记录函数的执行时间等性能相关信息,便于对系统性能进行分析和优化。
def monitor_performance(func):
def wrapper(*args, **kwargs):
# 可以在这里添加更详细的性能统计代码
func(*args, **kwargs)
return wrapper
@monitor_performance
def complex_calculation():
# 一些复杂计算
pass
5. 状态检查:比如在特定场景下对函数执行前的一些必要状态进行检查和处理,增强代码的健壮性。
def check_status(func):
def wrapper(*args, **kwargs):
if system_is_ready(): # 假设的系统状态检查
func(*args, **kwargs)
else:
print("系统未准备好")
return wrapper
@check_status
def start_operation():
print("开始操作")
start_operation()
6. 统一接口包装:对一组类似功能的函数进行统一的装饰,提供一致的行为和外观,提高代码的规范性和可识别性。
def standardize_api(func):
def wrapper(*args, **kwargs):
# 统一处理输入和输出格式等
result = func(*args, **kwargs)
return standardized_result(result) # 假设的标准化处理
return wrapper
@standardize_api
def api_function1():
return "原始结果 1"
@standardize_api
def api_function2():
return "原始结果 2"
7. 参数验证:在装饰器中进行参数的合法性检查,确保函数运行在正确的条件下。
def validate_args(func):
def wrapper(*args, **kwargs):
if validate_parameters(*args, **kwargs): # 假设的参数验证函数
func(*args, **kwargs)
else:
print("参数不合法")
return wrapper
@validate_args
def process_data(data):
print(f"处理数据: {data}")
process_data("invalid_data")
假设有一系列需要进行权限检查的函数,通过一个权限装饰器来统一处理,就避免了在每个函数中重复编写权限代码,同时也使权限逻辑的修改只需要在装饰器中进行,维护起来更加方便。而且,其他人在阅读代码时,也能快速理解这些函数具有特定的权限要求。