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文件å�§ã€‚