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