Python模块的动态加载机制
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']
不同点:
- import A.tank 在local名称空间中引入符合"A",并且将其映射到module A
- 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模块的动态加载机制的更多相关文章
- python模块与包加载机制
模块的搜索路径: When a module named spam is imported, the interpreter searches for a file named spam.py in ...
- 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)
基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 个人技术博客:http://www.cnblogs.com/M ...
- Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- java动态加载机制
假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象, ...
- Android中的动态加载机制
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- Android之Android apk动态加载机制的研究
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/22597587 (来自singwhatiwanna的csdn博客) 背景 问题 ...
- ExtJs中动态加载机制研究(转)
觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659 昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果 ...
- python的动态加载机制??
if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication app = QApplication(sy ...
- Android apk动态加载机制
参考链接:http://blog.csdn.net/singwhatiwanna/article/details/22597587
随机推荐
- node源码详解 (一)
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource1 本博客同步在https://cnodejs.o ...
- 比AutoMapper轻量快速简洁的实体映射库YeaJur.Mapper
之前在做实体深拷贝时一直使用的AutoMapper,但是总是觉得其写法比繁琐,效率也不算很高,自己写了一个轻量级的实体拷贝库YeaJur.Mapper,和AutoMapper 测试对比如下 PK项 Y ...
- MyBatis浅尝笔记
MyBatis应属于一种轻量级的java持久层技术,它通过简单的SQL xml或注解,将数据库数据映射到接口与POJO.最近项目要用到mybatis,所以学习之后在这里做个总结,文中的示例以xml配置 ...
- CodeForces 721A
A. One-dimensional Japanese Crossword time limit per test:1 second memory limit per test:256 megabyt ...
- PHP的一些天坑
什么叫天坑.天呐,原来这么坑,不知则已,细思极恐. 一.小数(符点数)不能直接比较是否相等 比如 if( 0.5+0.2==0.7 ) 的结果是 false.究其原因是因为,PHP是基于C语言的,而C ...
- 安装Ubuntu时的硬盘分区
根目录 大小:60G~100G(用来安装程序) 新分区的类型:主分区 新分区的位置:空间起始位置 用于:EXT4日志文件系统 挂载点:"/" 大小:4G 新分区的类型:逻辑分区 新 ...
- 蓝桥网试题 java 基础练习 时间转换
--------------------------------------- --------------------------------------- import java.util.*; ...
- Syslog4j如何实现接收日志
1.Syslog4j是一个实现Syslog(RFC3164)协议的Java开源类库包括客户端与服务器端.通过 UDP/IP, TCP/IP, TCP/IPover SSL/TLS, Unix Sysl ...
- Hadoop1.0.3环境搭建流程
0x00 大数据平台相关链接 官网:http://hadoop.apache.org/ 主要参考教程:http://www.cnblogs.com/xia520pi/archive/2012/05/1 ...
- (Jquery)避免数据相加小数点后产生多位数和计算精度损失
/** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失. * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var ...