一:模块的定义
模块就是对相关的代码段组织(数据对象、类、函数等---称为模块的属性)之后进行封装之后的对象,该对象提供一些接口(导入之后,使用". "操作符引用)供其它对象使用。
模块是按照逻辑上组织代码段的方法,而文件是物理上组织代码段的方法。
二:导入模块
将其他模块的属性导入到另一个属性,称为导入。
模块导入会经历一个“路径搜索”的过程。搜索路径被保存在模块sys的sys.path属性中(sys.path是包含有许多路径的字符串元素的列表)。
sys.path是一个列表,所以可以进行修改:使用append()、insert()方法添加新的路径。
sys.modules是一个字典,包含了当前导入了哪些模块;键名是模块名,值为模块所在的路径。
三:导入模块的方法
1、import 模块名
这种方法会将该模块的全部属性全部导入到另一个模块的对应作用域中。
若导入语句在函数中,则导入的属性就是在局部作用域中;若导入语句在模块的顶层,则导入的属性就是在全局作用域中。
2、from 模块名 import 模块中的属性名
该方法只会将模块中特定的属性导入到另一个模块的作用域中。
若导入语句在函数中,则导入的属性就是在局部作用域中;若导入语句在模块的顶层,则导入的属性就是在全局作用域中。
from会将模块的属性名字导入到当前的名字空间中
3、import导入时,使用as作为别名
四:模块的内建函数
__import__(module_name[,globals[,locals[,fromlist]]])
import语句在使用时会调用__import__()方法,module_name是当前要导入模块的名称,globals是当前全局符号表的名字的字典,locals是当前局部符号表的名字的字典,fromlist是使用from import语句导入的属性名称的列表。
__reload__(module_name) 该方法会将重新导入已经被完全导入的模块
__globals__() 返回调用者全局名称空间的字典(若调用者在局部名称空间中,方法会返回调用者所能访问的全局属性名称的字典)
__locals__() 返回调用者局部名称空间的字典(若调用者在局部名称空间中,方法会返回调用者定义的属性名称的字典)
五:区别import和from import
import导入模块的步骤:
1、找到指定的模块,必要时载入并初始化
导入模块时,先找到指定的模块(根据sys.path),在第一次载入时会执行模块内的代码(对代码中的def就创建一个函数对象,然后赋上函数名,遇到模块中被赋值的全局变量,那就创建这个赋值号右侧的对象,然后赋给变量)----这个过程其实就是模块对象创建的过程。
2、在import语句执行的地方为本地命名空间定义变量名(当模块对象创建完成之后,会在import语句执行的地方定义一个变量名并绑定到对应的模块对象上--不一定并绑定到import导入的模块对象上)----因此,使用import导入模块,会将该模块中的对象完整引用到另一个模块中。
如果指定的模块被成功取回,解释器将通过以下三种方式中的一种使之在本地(import执行的模块)命名空间中变得可用。
如果模块名后跟有as从句,那么as从句后的名称直接绑定被导入的模块。(就是我们刚才说的import sound.effects.echo as echo)
如果没有其他名称被特别的指定,同时被导入的模块又是顶层模块(指的是不是包内的模块),那么在本地命名空间里模块名称将作为被导入模块实例的引用而被绑定。(import sys就符合这个规定)
如果被导入的模块不是顶层模块,那么包含这个模块的最顶层包的名称将被绑定在本地命名空间,作为顶层包的引用。要想使用被导入的模块,必须使用自己的"全描述名称",而不是直接用模块名。
from import导入模块中对象的步骤:
1、找到from从句中指定的模块,加载并初始化它。
导入模块时,先找到指定的模块(根据sys.path),在第一次载入时会执行模块内的代码(对代码中的def就创建一个函数对象,然后赋上函数名,遇到模块中被赋值的全局变量,那就创建这个赋值号右侧的对象,然后赋给变量)----这个过程其实就是模块对象创建的过程。
2、对于跟在import后的每个标识符(名称):
验证from从句中加载的模块是否有这个名称的属性。(如果有,执行最后一步的名称绑定)
如果没有,尝试导入一个以这个名称为名字的子模块,然后再验证一下from从句中加载的模块是否有这个名称的属性。
如果from从句中加载的模块此时再没有这个名称的属性,则报 ImportError 错误。
如果没有报错, 本地命名空间会产生对标识符指向的对象的一个引用,如果有as从句,用as从句中的名称表示这个引用, 如果没有as从句,用属性名即标识符表示这个引用。
六:包和包的导入(暂时不更)
1、import 包的名称
2、from import
绝对导入
相对导入