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的模块不仅是单例模式,还是线程安全的单例模式,即使多线程并发导入同一个模块,也不会重复装载模块。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值