模块的概念
Python中的一个模块是一个文件。是一个命名空间,组织函数与类的地方。
导入模块时所发生的事(3件事)
- 寻找模块路径,通过sys.path寻找模块路径。sys.path可静态配置,也可动态配置,动态配置指在模块的代码中添加sys.path.add(“模块路径”)。不过只在该模块载入运行时有效。静态配置指在程序的标准库的sitepackages目录中添加.pth文件和配置PYTHONPATH环境变量。
- 编译成字节码,这个是可选的。
- 运行,执行模块的代码。
模块搜索路径的组成
- 程序的主目录
- PYTHONPATH环境变量设置的路径
- 标准链接库目录
- 任何.pth文件的内容,一行一行列出目录
其中1,3条是自动配置的。
重载模块带来的动态性
- 能让程序在运行时被修改测试,比如更改了某一模块的文件,只需要调用reload重新导入模块,修改即生效,而不需要重新编译,节省大量时间。
- 使用from导入模块中的变量名相当于变量名被深复制出来,所以重载模块不会影响到from导入的变量名,而用import导入的变量名由于用了点运算取出属性,所以会被影响到。
包导入
- import和from能通过路径来导入模块,这被称为包导入,比如 import dir1.dir2.dir。就会从模块搜索路径搜索含有dir1的文件夹。再一步一步查找下去,直到找到dir。语法上用.代替了\。
- 使用包导入的时候,必须遵循一条约束,导入包的路径中每个目录中必须有__init__.py文件。init文件替目录产生命名空间,目录的__all__属性就是所有目录下的模块__all__属性之和。
- 包相对导入使用from. import 模块名导入同一目录下的模块名。import 模块名会在sys.path里面查找导入,但是当前工作目录是sys.path的第一条目录,所以import能导入同一目录下的模块名
使用模块的建议
- 使用_x来命名变量,最小化from*的破坏,from*不会复制以_开头的变量名,from*会导入__all__列表中变量名。所以也可通过__all__赋值指定要复制的变量名。
- 使用__name__进行测试,每个模块都有__name__内置属性,当模块被导入时,__name__被赋值为模块名,运行时被赋值为__main__。