Python 装饰器链与复合装饰器实战解析
装饰器是 Python 提升代码复用与功能扩展的利器。在实际开发中,我们常常需要给同一个函数应用多个装饰器,形成装饰器链,或者创建复合装饰器一次性增强多个功能。本文将深入解析装饰器链的执行顺序及复合装饰器的设计实战。
一、装饰器链的执行顺序
多个装饰器叠加时,装饰器由内向外应用,执行顺序与语法书写相反。
python
复制编辑
def deco1(func): def wrapper(*args, **kwargs): print("deco1 前置") result = func(*args, **kwargs) print("deco1 后置") return result return wrapper def deco2(func): def wrapper(*args, **kwargs): print("deco2 前置") result = func(*args, **kwargs) print("deco2 后置") return result return wrapper @deco1 @deco2 def say(): print("执行 say 函数") say()
输出顺序:
perl
复制编辑
deco1 前置 deco2 前置 执行 say 函数 deco2 后置 deco1 后置
二、复合装饰器的设计
复合装饰器将多个装饰器逻辑合并为一个装饰器,方便统一管理。
python
复制编辑
def composite_decorator(func): def wrapper(*args, **kwargs): print("复合装饰器前置逻辑1") print("复合装饰器前置逻辑2") result = func(*args, **kwargs) print("复合装饰器后置逻辑1") print("复合装饰器后置逻辑2") return result return wrapper @composite_decorator def greet(): print("Hello World") greet()
三、带参数的复合装饰器
结合带参数装饰器,实现功能更灵活的复合装饰器。
python
复制编辑
from functools import wraps def composite(level): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): print(f"日志级别: {level} - 前置操作") result = func(*args, **kwargs) print(f"日志级别: {level} - 后置操作") return result return wrapper return decorator @composite("DEBUG") def add(a, b): print(f"计算 {a} + {b}") return a + b add(3, 4)
四、实战案例:权限校验与日志记录复合装饰器
python
复制编辑
def permission_required(func): @wraps(func) def wrapper(user, *args, **kwargs): if not user.get("is_admin"): print("权限不足") return None return func(user, *args, **kwargs) return wrapper def log(func): @wraps(func) def wrapper(*args, **kwargs): print(f"调用函数 {func.__name__}") return func(*args, **kwargs) return wrapper def composite_decorator(func): return permission_required(log(func)) @composite_decorator def delete_data(user): print("删除数据操作") delete_data({"name": "张三", "is_admin": False}) delete_data({"name": "李四", "is_admin": True})
五、总结
-
装饰器链执行顺序为从内到外,运行时从外到内
-
复合装饰器将多个装饰器逻辑合并,提高代码整洁度
-
带参数装饰器可实现更灵活的功能控制
-
结合复合装饰器应用权限与日志功能,提升代码质量
https://bjqb.wang
https://www.bjqb.wang
https://bjsm.wang
https://www.bjsm.wang
https://bleo.wang
https://www.bleo.wang
https://ono.wang
https://www.ono.wang
https://onz.wang
https://www.onz.wang
更多推荐


所有评论(0)