Python教程
Python Reference:Python 语言参考手册 — Python 3.11.3 文档
python装饰器
Python执行流程和Module理解(Point)
总的来说,Python的执行过程,就是解释器从main.py(Python xx.py这个xx就是作为main)开始,逐行翻译代码,碰到需要执行的就进行执行。特别要注意的是,一切都是对象这种特性,作为动态语言,在前面定义的内容很可能在后面会被修改掉。比如一个函数定义,在后面可以被替换为另一个函数的实现。
再有就是模块的概念,也就是import使用其他py文件。
比如我们导入包里面的一个模块:
关于模块导入的本质实现,大概流程如下:
查看已导入包:
通过
sys.modules
可以访问所有当前已导入的模块。
modules
是一个字典,key
是模块的路径,例如pack1.module_a
, value
是一个模块对象
模块对象中,属性名是模块中全局变量的名字,即sys.modules['pack1.module_a'].__dict__
等于module_a里面的globals().基于此,对Python中循环导入问题的探讨
首先看一下什么是循环导入和循环导入的原因。
root.py
module_a.py
module_b.py
会报错:
代码执行的流程:
- 执行root.py的
from pack1.module_a import class_a
,发现需要导入模块module_a
- 一个空的字典会被创建,对应module_a的globals
- module_a的代码会被执行,当执行到
from pack2.module_b import class_b
时,发现需要导入模块module_b
- 一个空的字典会被创建,对应module_b的globals
- module_b的代码会被执行,当执行到
from pack1.module_a import class_a
时,发现需要导入模块module_a,但是此时已经有module_a的globals了,所以直接访问字典里的class_a,但是由于module_a的globals还是空的,即里面没有class_a,所以抛出异常
解决方法参考前面的博客,这个只是为了理解处理流程。
类似的示例:
module导入示例- 作者:Olimi
- 链接:https://olimi.icu/article/36401098-9889-490d-a476-d6a8ffc26e1f
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。