该文章内容整理自《Python编程:从入门到实践》、《流畅的Python》、以及网上各大博客
模块
Python 提供了强大的模块(Modules)支持,不仅 Python 标准库中包含了大量的模块(即标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率。模块可以理解为是对代码更高级的封装,即把能够实现某一特定功能的代码编写在同一个 .py 文件中,并将其作为一个独立的模块,这样既可以方便其它程序或脚本导入并使用,同时还能有效避免函数名和变量名发生冲突
import
import用于导入模块,其具体用法为
- import 模块名1 [as 别名1], 模块名2 [as 别名2],…:使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错
- from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…:使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。也可以导入指定模块中的所有成员,即使用 form 模块名 import *,但此方式不推荐使用。因为这种用法在导入后使用模块中的成员时无需以模块名为前缀,这有可能与本文件中的已有成员名产生冲突
reload()
默认情况下,模块在第一次被导入之后,其他的导入都不再有效。如果此时在另一个窗口中改变并保存了模块的源代码文件,也无法更新该模块。这样设计的原因在于,导入是一个开销很大的操作(导入必须找到文件,将其编译成字节码,并且运行代码),以至于每个文件、每个程序运行不能够重复多于一次
若此时使用import导入模块后模块发生变化,而需要重新导入新的模块,则可以通过reload()进行重新加载。重新加载包括最初导入模块时应用的分析过程和初始化过程。这样就允许在不退出解释器的情况下重新加载已更改的Python模块。但是注意
- 如果模块在语法上是正确的,但在初始化过程中失败,则导入过程不能正确地将模块的名字绑定到符号表中。这时,必须在模块能被重新加载之前使用__import__()函数加载该模块
- 重新加载的模块不删除最初旧版本模块在符号表中的登记项
- 如果模块利用 from…import… 方式从另一模块导入对象,reload()函数不重新定义导入的对象,可利用 import… 形式避免这个问题
- 提供类的重新加载模块不影响所提供类的任何已存实例,已存实例将继续使用原来的方法定义,只有该类的新实例使用新格式
- reload()函数希望获得的参数是一个已经加载了的模块对象的名称,所以如果在重载之前,需要确保已经成功地导入了这个模块
在 Python2 中reload()是内置函数,能够直接使用。但是 Python3 把reload()内置函数移到了imp标准库模块中,因而使用前需要从imp中导入
__import__()
import语句结合了两个操作:先搜索指定名称的模块,然后将搜索结果绑定到当前作用域中的名称。而内置函数__import__()只搜索指定名称的模块,并且,import语句执行过程中是调用__import__()来完成模块检索的
import语句属于静态导入,而__import__()函数用于动态加载模块。一般形式如下,它返回导入的模块,一般会赋值给变量,以便后期使用
__import__(name, globals=None, locals=None, fromlist=(), level=0)
其中
- name:模块名。一方面,在使用import导入模块时,模块名中不能含有空格或者是以数字开头,因为在import语法中空