Python在运行环境初始化中,就将sys module加载到了内存中,

实际上,Python是将一大批的module加载到了内存中。但是为了使local名字空间能够达到最干净的效果,Python并没有将这些符号暴露在当前的local名字空间中,

而是需要用户显式的通过import机制通知Python:需要将这个符号引入到local名字空间中。这些预先被加载进内存的module存放在sys.modules中

可以看到os module是从C:\Python25\lib\os.pyc这个文件中引入的,它是一个内建的module。通过import机制,这个module被引入到了当前的local名字空间。从两个不同id操作中可以看到,Python虚拟机的import动作引入的正是事先已经在Python初始化阶段被加载到sys.modules集合中的os module。

嵌套import

在usermodule1.py和usermodule2.py中进行的import动作并没有影响到上一层的名字空间,而只是影响到了各个module自身的名字空间,更准确的说是影响到了各个module自身所维护的那个dict对象。

实际上,所有的import动作都会影响到全局module集合,即如果程序的另一处再次import这个module,Python虚拟机只需要将全局module集合中缓存的那个module对象返回即可。

import A.tank

import之前的名称空间: ['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
import之后的名称空间: ['A', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
A的local名称空间 ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'tank']

from A import tank

import之前的名称空间: ['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
import之后的名称空间: ['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'tank']

import A.tank与from A import tank的区别:

相同点:

两者都将A.tank module以及A作为moudle添加到sys.modules集合中

sys.modules['A']

sys.modules['A.tank']

不同点:

  1. import A.tank 在local名称空间中引入符合"A",并且将其映射到module A
  2. from A import tank Python虚拟机在local名称空间中引入符合"tank",并将其映射到module A.tank

符号重命名

之前的例子都是通将module自身的名字暴露到了当前的local名称空间,Python通过as关键字可以控制module以什么名字引入到当前的local名称空间中。

当前local名称空间中的Tank实际被映射到了module A.tank。import A.tank 在名称空间引入的是符号"A",而使用as后,引入的是"Tank",所以当前名称空间中无法访问到A了

符号的销毁与重载

  • 符号销毁

只是删除了符号"Tank",并没有真正从sys.modules集合中删除module

  • reload操作

只是向对应的module中添加新的符号,如果有符号在源文件中被删除,这种删除是不会影响到module所维护的dict的。

Python模块的动态加载机制的更多相关文章

  1. python模块与包加载机制

    模块的搜索路径: When a module named spam is imported, the interpreter searches for a file named spam.py in ...

  2. 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)

    基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 个人技术博客:http://www.cnblogs.com/M ...

  3. Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...

  4. java动态加载机制

    假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象, ...

  5. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  6. Android之Android apk动态加载机制的研究

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 背景 问题 ...

  7. ExtJs中动态加载机制研究(转)

    觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659 昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果 ...

  8. python的动态加载机制??

    if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication app = QApplication(sy ...

  9. Android apk动态加载机制

    参考链接:http://blog.csdn.net/singwhatiwanna/article/details/22597587

随机推荐

  1. puppet的配置清单书写

    puppet的配置清单书写 1使用数组,合并同类的 例如你想安装很多软件,如果分开来写的话,很麻烦,不简洁,这时我们可以使用数组来完成 以前我们这样来写 class packages{ package ...

  2. .md即markdown文件的基本常用编写语法(图文并茂)

    序言: 很久没有写博客了,感觉只要是不写博客,人就很变得很懒,学的知识点感觉还是记不住,渐渐地让我明白,看的越多,懂的越少(你这话不是有毛病吗?应该是看的越多,懂的越多才对),此话怎讲,当你在茫茫的前 ...

  3. office如何去除多页签

    写文档会遇到同时打开多个文档,偶尔可能需要对比,而有时office会出现跟浏览器类似的多页签界面.如何去除多页签,office本身没有此加载项,一般都是作为插件或组件形式另外安装,导致我们不知道从哪里 ...

  4. 2017《JAVA技术》预备作业

    1.阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? ==我期望的师生关系是长辈和晚辈,前辈和后生,朋友与朋友之间的关系,作为晚辈,要尊敬长辈,不能对长辈进行言语攻击和起冲突:作为后生,要谨遵教诲 ...

  5. Xamarin 小试牛刀 通知栏消息通知和按钮(基于Java代码人肉转换)

    本示例基于网友现有安卓项目人肉翻译,在Xamarin中替换和修改了很多方法的命名,比如某些属性需要去掉getName的get前缀, 有些方法名称需要使用Pascal命名法替换Java的Camel 命名 ...

  6. 警告1909。无法创建快捷方式VMware Workstation Pro.Ink。解决方法(附 VMware_workstation 12的安装方法)

    电脑之前装过VMware 10,很长时间没用就卸载了,也没有在意卸载的干不干净,直到最近需要用Linux系统,重新安装了VMware 12,就出现下面这样的情况: 警告1909.无法创建快捷方式VMw ...

  7. Myeclipse插件将wsdl生成java客户端代码

    一.建立webservice服务端: 1.新建一个web service project,名称为webservice_server截图如下,点击finish. 2.选择工程,点击右键,选择new-&g ...

  8. 为什么亚马逊云计算中的DNS服务叫Route53?

    最近在用亚马逊的云计算服务,看到它的DNS服务的名字叫做"Route 53".这个名字让我很好奇,为什么叫"Route 53"呢?有什么特殊含义? 看到了这个Q ...

  9. select中的文字垂直居中的问题

    select文字在默认和边框高度增加时 是默认居中的.你要是不想居中的话可以用padding值调整.但是右侧的三角不会改变. select在高度减小时.字体是不会垂直居中的.无论你用什么他都不会垂直居 ...

  10. 阿里巴巴Java开发手册———个人追加的见解和补充(一)

    先上干货,<阿里巴巴Java开发手册>的下载地址 https://yq.aliyun.com/articles/69327?spm=5176.100239.blogcont69327.15 ...