python的模块为什么是天然单例模式

参考
由import 机制原理分析为什么Python模块就是天然的单例模式

LEGB
python的命名空间规则为LEGB
L:local-----函数内的名字空间
E:Enclosing function locals-----外部嵌套函数的名字空间(例如closure)
G:global----函数定义所在模块(文件)的名字空间
B:built_in----Python内置模块的名字空间

sys.modules
sys.modules是一个将模块名称映射到已装载模块的全局字典,python启动后就存在于内存之中,当modules第一次加载时,sys.modules会记录该模块,当modules存在于sys.modules时,会直接反回< modules> 对象

import
import modulesA
import的时候底层会经历如下操作:
1:检查name A是否存在于sys.modules,检查是否存在于为A的key
2:分两种情况讨论

  • 若存在于为A的key,获得< module A >对象

  • 若不存在于为A的key,sys.modules会以A为key建立一个< module A >对象,此时< module A >对象的__dict__对象还没有加载模块A的全局变量、函数、类,然后从sys.path目录中按模块A来查找对应文件(py\pyc\pyd),找到后进行编译、加载字节码文件,为__dict__属性绑定全局变量、函数、类

3: 将< module A >对象赋值给过global空间内的变量A

由于在程序运行期间,A只会加载一次,从而< module A >对象只有一个,无论import多少次,得到的都是同一个< module A >对象。这符合单例模式的定义,所以python的模块是天然单例模式


Python的模块不仅是单例模式,还是线程安全的单例模式,即使多线程并发导入同一个模块,也不会重复装载模块。


你可能感兴趣的:(学习记录,python)