当前位置: 首页 > web >正文

Python装饰器执行时机详解:模块加载时的魔法

装饰器执行的基本原理

Python装饰器在程序运行过程中遵循独特的执行逻辑,其核心特性体现在模块加载阶段的即时执行。通过示例7-2的registration.py 模块,我们可以清晰观察到装饰器与函数执行的时序差异。

registry = []def register(func):print('running register(%s)' % func)registry.append(func) return func @register 
def f1(): print('running f1()')@register 
def f2(): print('running f2()')def f3(): print('running f3()')def main():print('running main()')print('registry ->', registry)f1(); f2(); f3()if __name__ == '__main__': main()

关键执行时序分析

模块加载阶段

当模块被导入(import registration)或作为脚本运行时,装饰器会立即执行
输出显示装饰器注册过程发生在main函数之前:

running register(<function f1 at 0x100631bf8>)
running register(<function f2 at 0x100631c80>)

函数执行阶段

被装饰函数仅在显式调用时执行
main函数中调用f1/f2时才会输出:

running f1()
running f2()
running f3()

装饰器与函数的执行对比

执行阶段装饰器行为函数行为
模块加载时立即执行(注册函数)仅保存函数定义
显式调用时无额外操作执行函数体

实际应用中的注意事项

模块组织建议

装饰器应独立模块定义(如utils/decorators.py )
示例中的同模块定义仅用于演示

装饰器返回值规范

通常应返回新包装函数:

 def logged(func): @wraps(func) def wrapper(*args, **kwargs): print("Calling", func.name) return func(*args, **kwargs) return wrapper

Web框架中的典型应用

路由注册模式

routes = []def route(url):def decorator(func):routes.append((url,  func))return func return decorator @route("/home")
def home(): ...

性能监控装饰器

def timer(func): 
@wraps(func) 
def wrapper(*args, **kwargs):start = time.time() result = func(*args, **kwargs)print(func.name, "took", time.time()-start, "s") return result return wrapper

最佳实践总结

时序控制

利用模块加载时的装饰器执行特性实现自动注册
通过延迟执行保证函数调用的灵活性

设计模式

结合functools.wraps 保持函数元数据
使用闭包实现状态保持(如计数器装饰器)

调试技巧

通过打印装饰器执行日志定位初始化问题
使用pdb.set_trace() 在装饰器内部设置断点
这种模块加载时的即时执行特性,使得装饰器成为Python实现"元编程"的强大工具。理解其执行时序不仅有助于编写高效代码,更能帮助开发者设计出符合Pythonic规范的模块化系统。

http://www.xdnf.cn/news/3513.html

相关文章:

  • 跟韩学AiOps系列之2025学MySQL系列_如何在MySQL中开启和提交事务?!
  • (10)Vue3核心语法大全
  • Gradio全解20——Streaming:流式传输的多媒体应用(3)——实时语音识别技术
  • 推荐系统(1)--用户协同过滤和物品协同过滤
  • 头皮理疗预约小程序开发实战指南
  • Linux常用命令28——addgroup添加组
  • 【android Framework 探究】pixel 5 内核编译
  • MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式
  • GAMES202-高质量实时渲染(Assignment 2)
  • 正则表达式与文本三剑客grep、sed、awk
  • 【无需docker】mac本地部署dify
  • 从文本到向量:揭秘词向量转换的奥秘与实践
  • C++负载均衡远程调用学习之QPS性能测试
  • 溯因推理思维——AI与思维模型【92】
  • AimRT从入门到精通 - 03Channel发布者和订阅者
  • 18. LangChain分布式任务调度:大规模应用的性能优化
  • 【git】获取特定分支和所有分支
  • 【东枫科技】AMD / Xilinx Alveo™ V80计算加速器卡
  • 文章五《卷积神经网络(CNN)与图像处理》
  • Java大师成长计划之第10天:锁与原子操作
  • AimRT从入门到精通 - 04RPC客户端和服务器
  • 沥青路面裂缝的目标检测与图像分类任务
  • 【Hive入门】Hive性能调优:小文件问题与动态分区合并策略详解
  • React pros比较机制
  • 模拟开发授权平台
  • 【嵌入式Linux】基于ARM-Linux的zero2平台的智慧楼宇管理系统项目
  • 中小企业MES系统数据库设计
  • Spring MVC @RequestHeader 注解怎么用?
  • VMware提供的三种网络连接模式
  • Android WebView加载h5打开麦克风与摄像头的权限问题