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

import 机制原理

当我们使用 import A 这行代码导入模块A时,底层做了以下事情:

  1. 检查模块A是否已经被加载到了sys.modules中,即检查字典sys.modules中是否有A这个key。
    (sys.modules是一个将模块名称映射到已装载模块的全局字典。该字典在python启动后就存在于内存中。字典sys.modules对于导入模块起到了缓存的作用。当某个模块第一次导入,字典sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。)
  2. 获取A这个key对应的对象,分为两种情况:
    情况(一):如果 sys.modules 中找到了A这个key,那么说明这个模块已经装载过,则通过key获得了对应的< module A >对象,直接执行步骤3。
    情况(二):如果 sys.modules 中没有找到A这个key,那么说明这个模块是全局第一次被导入,则执行下面的装载工作。在sys.modules中以A为key创建一个新的module对象(< module A >),此时< module A >的__dict__属性中还没有绑定模块A中的全局变量、函数、类。然后从sys.path目录中按照模块名称A查找模块文件,模块文件可以是py、pyc、pyd,找到后将模块编译、执行模块文件中的代码,为执行到的全局变量、函数、类分配内存,并其将绑定到的__dict__属性上。
  3. 在当前命名空间中将< module A >这个对象赋值给变量A。

由上述原理可见,在程序运行期间模块A只装载一次,从而< module A >对象只有一个,无论import多少次,得到的都是同一个< module A >对象。这符合单例模式的定义,即单例对象的类只能允许一个实例存在。

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

参考文档

  1. 深入理解python之模块系统
  2. Python : Module导入机制
  3. Python 3.x可能是史上最详解的【导入(import)】
  4. python深入之包和模块的导入机制(重点)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值