Python模块基础
Python模块:
- 可以将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块
- 模块在物理形式上表现为以.py结尾的代码文件
- 一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件
- 模块的文件名就是模块的名字加上扩展名.py
- 每个模块都有自己的名称空间
- Python允许“导入”其它模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统
- Python中,模块也是对象
- 在一个模块的顶层定义的所有变量都在被导入时成为了被导入模块的属性
Python程序架构:
- 一个Python程序通常包括一个顶层程序文件和其它的模块文件(0个、1个或多个)
- 顶层文件:包含了程序的主要控制流程
- 模块文件:为顶层文件或其它模块提供各种功能性组件
- 模块首次导入(或重载)时,Python会立即执行模块文件的顶层程序代码(不在函数内的代码),而位于函数主体内的代码直到函数被调用后才会执行
- 标准库模块 : help(‘modules’)可查询所有标准库模块
模块的执行环境:
- 模块是被导入的,但模块也可以导入和使用其它模块,这些模块可以用Pyhton或其它编程语言写成
- 模块可内含变量、函数以及类来进行其工作,而函数和类可以包含变量和其它元素
导入模块:
在导入模块时只能使用模块名,而不能使用带.py后缀的模块文件名
import语句
导入指定的整个模块,包括生成一个以模块名命名的名称空间
import module1[,module2[,...moduleN]]
建议一个import语句只导入一个模块
import module as module_alias
- from-import语句
常用于只导入指定模块的部分属性至当前名称空间
from module import name1[,name2[,...nameN]]
- import和from-import是赋值语句
- import和from是可执行语句,类似于def,因此,他们可以嵌套在if测试中,出现在def中等等
- Python执行到这些语句时才会对其进行解析,这意味着,所有来自模块的属性仅在import语句执行后才能使用
- import和from都是隐性赋值语句
- import将整个模块对象赋值给一个变量名
- from将一个或多个变量名赋值给导入此模块的模块中的同名对象
- 模块就是名称空间
- 模块的名称空间可以通过属性_ _ dict _ _或dir(M)获取
- 模块属性可通过点号(.)运算符获取,格式为M.attr
- 模块是一个独立的作用域(本地变量就是全局变量)
import的工作机制:
- import语句导入指定的模块时会执行三个步骤:
- 找到模块文件
- 在指定的路径下搜索模块文件
- 编译成字节码
- 文件导入时就会编译,因此,顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件
- 执行模块的代码来创建其所定义的对象
- 模块文件中的所有语句会依次执行,从头至尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性
- 找到模块文件
- 注意:模块只在第一次导入时才会执行如上步骤
- 后续的导入操作只不过是提取内存中已加载的模块对象
- reload()可用于重新加载模块
模块搜索:
- Python解释器在import模块时必须先找到对应的模块文件
- 程序的主目录
- PYTHONPATH目录(如果设置了此变量)
- 标准链接库目录
- 任何.pth文件的内容(如果存在.pth文件)
- 这四个组件组合起来即为sys.path所包含的路径,而Python会选择在搜索路径中的第一个符合导入文件名的文件