Python的动态加载机制

1、Python所有的模块加载到内存后,都会放在sys.modules中。
     当我们在一个文件中import一个模块的时候,Python会先去sys.modules中查找是否已经加载过这个模块,如果是,则将这个模块的名字加入到正在调用import的local命名空间中;如果没有加载过这个模块,则从sys.path中按照模块名去查找,找到后加载到内存,并加入到sys.modules中。(所以如果要让Python能找到自己写的一些模块,有时需要在sys.path中加入自己模块的路径)

2、一个模块不会被重复加载。当模块A已经在sys.modules中,其他地方要使用模块A的话,需要import A,但是底层机制并不会重复import,但是需要import A是因为要把已经在sys.modules中的模块加载到local命名空间中。

3、关于循环嵌套,参考下面的例子:
 

# A.py
from B import D
class C:
    pass

# B.py
from A import C
class D:
    pass

当执行A时,from B import D会报错,因为执行这句的时候,Python内部先去sys.modules中找module B,如果发现没有,就会自己创建一个module B,此时module B中__dict__没有内容;接着会去执行B.py中的表达式,去添加module B中__dict__中的内容。执行B.py的时候,会去找module A,同样因为sys.modules中没有module A,所以就会自己创建一个新的module A,此时的module A的__dict__也是空的,这时又会去执行A.py中的语句,然后发现sys.modules中已经有module B了,就会在module B中去import D,但是module B中__dict__还是空的,Python内部又不知道去哪里创建一个新的module D,就报错了。

猜你喜欢

转载自blog.csdn.net/Michael_Zheng_Tech/article/details/82828877
今日推荐