模块和包

模块按照层次结构组织成包

定义一个具有层次结构的模块就如同在文件系统上创建目录一样简单;
init.py文件的目的就是包含可选的初始化代码;
可以用init.py文件来自动加载子模块,如下只需要import formates就可以导入jpg和png模块了,不需要分别导入;
formates/
init.py
jpg.py
png.py

from . import jpg
from . import png

对所有符号的导入进行精准控制

在模块中定义一个变量all,用来显式列出可导出的符号名,
from moule import * 这种方式会把所有不以下划线开头的符号名全部导出;

用相对名称来导入包中的子模块

用绝对名称来导入的缺点是会把最顶层的包名称硬编码到源代码中,如果有修改则不是很灵活;
相对导入在要在特定条件下,脚本顶层目录的模块不能使用,如果包里的某个部分是直接以脚本的形式执行也不能使用;

from . import grok
from . .B import bar

将模块分解成多个文件

在逻辑上把多个文件拼接成一个单独的命名空间,关键在于 创建一个包目录,i并通过init.py将各个部分粘合在一起;

惰性导入的概念是在实际需要的时候才加载组件,但是会破坏继承和类型检查机制;(真实应用multiprocessing/init.py)

你可能感兴趣的:(模块和包)