第21章 模块:宏伟蓝图
为什么使用模块
- 代码重用
- 系统命名空间的划分
- 实现共享服务和数据
import如何工作
程序第一次导入指定文件时,会执行三个步骤:
- 找到模块文件
- 编译成位码
- 执行模块的代码来创建其所定义的对象
在这之后,导入相同的模块,会跳过这三个步骤,只是提取内存中已加载的模块对象。
从技术上讲,python把载入的模块储存到一个名为sys.modules的表中,并在一次导入操作的开始检查该表,如果模块不存在,将会启动一个三个步骤的过程。
模块搜索路径
- 程序的主目录
- pythonpath目录
- 标准链接库目录
- 任何.pth文件的内容
上述四个组合起来就是sys.path,即目录名称字符串列表。
第22章 模块代码编写基础
模块的导入只会在第一次导入的时候载入并且执行。
注意:使用import 语句才有机会改变被导入进来的文件的变量,使用from 导入不行。
下面两种语句完全等价
from module import name1,name2
# 这两种方式等价
import module
name1=module.name1
name2=module.name2
del module
注意:
- 函数绝对无法看见其他函数的变量名,除非它们从物理上处于这个函数内。
- 模块程序代码绝对无法看见其他模块内的变量名,除非明确进行导入。
重载模块
使用reload函数强制重载模块
- reload是函数,不是语句
- 传给reload的是已经存在的模块对象,不是变量名
- 使用reload之前,要先导入自己
第23章 模块包
第24章 高级模块话题
在模块中隐藏数据
最小化from * 的破坏
- 利用
_X
:不被复制的变量名 - 利用
__all__
:要被复制的变量名
模块陷阱
顶层代码的语句次序的重要性:模块之间如果有相互引用,导入的顺序就十分重要。
from复制变量名,而不是连接,因此修改变量后,无法影响到源文件,但是一旦import进来,在用句点连接,就会定向到源文件中,就会影响到源文件。
from * 尽量不要用,因为会覆盖全局变量。
reload不会影响from导入