============================ 10.1 构建一个模å—的层级包 ============================ ---------- 问题 ---------- ä½ æƒ³å°†ä½ çš„ä»£ç 组织æˆç”±å¾ˆå¤šåˆ†å±‚æ¨¡å—æž„æˆçš„包。 ---------- 解决方案 ---------- å°è£…æˆåŒ…是很简å•çš„ã€‚åœ¨æ–‡ä»¶ç³»ç»Ÿä¸Šç»„ç»‡ä½ çš„ä»£ç ï¼Œå¹¶ç¡®ä¿æ¯ä¸ªç›®å½•都定义了一个__init__.py文件。 例如: .. code-block:: python graphics/ __init__.py primitive/ __init__.py line.py fill.py text.py formats/ __init__.py png.py jpg.py ä¸€æ—¦ä½ åšåˆ°äº†è¿™ä¸€ç‚¹ï¼Œä½ 应该能够执行å„ç§importè¯å¥ï¼Œå¦‚下: .. code-block:: python 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能够用æ¥è‡ªåŠ¨åŠ è½½åæ¨¡å—: .. code-block:: python # 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文件å§ã€‚