10.1 构建一个模�的层级包¶

问题¶

你想将你的代�组织�由很多分层模�构�的包。

解决方案¶

�装�包是很简�的。在文件系统上组织你的代�,并确��个目录都定义了一个__init__.py文件。 例如:

graphics/
    __init__.py
    primitive/
        __init__.py
        line.py
        fill.py
        text.py
    formats/
        __init__.py
        png.py
        jpg.py

一旦你�到了这一点,你应该能够执行��import语�,如下:

import graphics.primitive.line
from graphics.primitive import line
import graphics.formats.jpg as jpg

讨论¶

定义模�的层次结构就�在文件系统上建立目录结构一样容易。 文件__init__.py的目的是�包����行级别的包的�选的�始化代�。 举个例�,如果你执行了语�import graphics, 文件graphics/__init__.py将被导入,建立graphics命�空间的内容。�import graphics.format.jpg这样导入,文件graphics/__init__.py和文件graphics/formats/__init__.py将在文件graphics/formats/jpg.py导入之�导入。

�大部分时候让__init__.py空�就好。但是有些情况下�能包�代�。 举个例�,__init__.py能够用�自动加载�模�:

# graphics/formats/__init__.py
from . import jpg
from . import png

�这样一个文件,用户�以仅仅通过import grahpics.formats�代替import graphics.formats.jpg以�import graphics.formats.png。

__init__.py的其他常用用法包括将多个文件�并到一个逻辑命�空间,这将在10.4�节讨论。

��的程�员会�现,�使没有__init__.py文件存在,python�然会导入包。如果你没有定义__init__.py时,实际上创建了一个所谓的“命�空间包�,这将在10.5�节讨论。万物平等,如果你�手创建一个新的包的�,包�一个__init__.py文件�。