装饰器是 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
 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐