10.1 构建一个模块的层级包
问题
你想将你的代码组织成由很多分层模块构成的包。
解决方案
封装成包是很简单的。在文件系统上组织你的代码,并确保每个目录都定义了一个__init__.py
文件。 例如:
一旦你做到了这一点,你应该能够执行各种import语句,如下:
讨论
文件__init__.py
的目的是要包含不同运行级别的包的可选的初始化代码。 举个例子,如果你执行了语句import graphics
, 文件graphics/__init__.py
将被导入,建立graphics命名空间的内容。像import graphics.format.jpg
这样导入,文件graphics/__init__.py
和文件graphics/graphics/formats/__init__.py
将在文件graphics/formats/jpg.py
导入之前导入。
绝大部分时候让__init__.py
空着就好。但是有些情况下可能包含代码。 举个例子,__init__.py
能够用来自动加载子模块:
像这样一个文件,用户可以仅仅通过import grahpics.formats
来代替import graphics.formats.jpg
以及import graphics.formats.png
。
__init__.py
的其他常用用法包括将多个文件合并到一个逻辑命名空间,这将在10.4小节讨论。
敏锐的程序员会发现,即使没有__init__.py
文件存在,python仍然会导入包。如果你没有定义__init__.py
时,实际上创建了一个所谓的“命名空间包”,这将在10.5小节讨论。
Last updated
Was this helpful?