10.1 構建一個模塊的層級包

2018-02-24 15:27 更新

問題

你想將你的代碼組織成由很多分層模塊構成的包。

解決方案

封裝成包是很簡單的。在文件系統(tǒng)上組織你的代碼,并確保每個目錄都定義了一個init.py文件。 例如:

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

一旦你做到了這一點,你應該能夠執(zhí)行各種import語句,如下:

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

討論

定義模塊的層次結構就像在文件系統(tǒng)上建立目錄結構一樣容易。 文件init.py的目的是要包含不同運行級別的包的可選的初始化代碼。 舉個例子,如果你執(zhí)行了語句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能夠用來自動加載子模塊:

# 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小節(jié)討論。

敏銳的程序員會發(fā)現(xiàn),即使沒有init.py文件存在,python仍然會導入包。如果你沒有定義init.py時,實際上創(chuàng)建了一個所謂的“命名空間包”,這將在10.5小節(jié)討論。萬物平等,如果你著手創(chuàng)建一個新的包的話,包含一個init.py文件吧。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號