Python 包、模組、類以及程式碼檔案和目錄的一種管理方案

發表於2016-09-09

1.要解決的問題

Python在語義中存在著模組(當然還有函式)這幾個概念。

在編寫Python程式碼時,我們需要管理程式碼的檔案目錄結構

這時候會遇到這樣一種情況:

1.由於Python一個檔案一個模組一個帶__init__.py的目錄算一個

2.而為了控制程式碼檔案不要過大,我們需要的是一個類(幾個類或加些許函式)分配一個檔案

3.這時候會出現類似這樣的語句:

以上除了直觀上可以看出import過長外,隱藏的另一點是我們是希望一個類一個檔案,在使用多個相關類的時候就必須寫很多import。(注:我們可不想一堆程式碼扎堆,弄出一個超大程式碼檔案。)

2.解決方案要達到的效果

由於Python裡一個帶__init__.py的目錄算一個包,所以利用這一機制,把類檔案放在包裡,用包來管理類。

注:在Python裡“包是模組,而模組不是包”。用system.modules可以取到的名字是包和模組都有的,而用__package__卻能很好的區分包和模組。也就是“包其實是一種特殊的模組”。

3.解決方案

這就是解決方案的檔案base.py,程式碼很短:

程式碼用意我寫在註釋裡了,就是以裝飾器來把類新增到包的__dict__和__all__裡。__all__需要利用packet在包裡生成,不這麼做只會使得from package_name import * 後不能找到類,需要寫具體的類名from package_name import ClassA。

4.使用解決方案

先來看下使用解決方案後的目錄結構:

程式碼處就需要做到以下幾點:

1.關於被匯出的類檔案裡應該怎麼做,這裡以class_b.py為例子:

2.使用了匯出功能的包要做什麼,這裡以package_a包為例:

5.總結

使用該解決方案可以歸納為兩點:

1.用@base.export標記要匯出的類或函式

2.在包__init__.py裡初始化__all__ = base.packet(__name__)

3.(說好的只有兩點呢?)其實第2點是可選的,不過最好加上。而在包的__init__.py裡匯入子模組才是真正的第2點。不然子模組不會被載入,也談不上匯出了。

最後,demo.py裡可以這麼寫,和預期的效果一樣:)

相關文章