2010-07-31 70 views
1

我有一個包含許多類的模塊(tools.py)。我想將它們解壓到它自己的「whyteboard.tools」包中,每個類都在它自己的文件中。將8+類的模塊拆分成一個包,每個類都包含在自己的文件中

但是,我之前從一個基本目錄中的所有類轉移到我的項目根目錄下的一個包中,並且在以舊格式保存的pickle文件中加載時遇到問題。 (見:https://stackoverflow.com/questions/2121874)。我不得不在加載文件時修補sys.modules字典,然後再刪除它。討厭......

做這個舉動的最好方法是什麼?

是它最好在包的__init__還導入我的每一個類的,否則我不得不

from whyteboard.tools.pen import Pen 

,而不是

from whyteboard.tools import Pen 

回答

1

怎樣做這一招最好的辦法?

首先。別。每個文件的類別不會改善任何內容,所以爲什麼要麻煩?

不得不在已經保存的舊的格式

正確醃文件與加載問題。你必須有加載文件的問題,因爲類名已經改變,以舊格式醃製。

爲什麼要改變它們,如果它導致問題?

如果你絕對必須改變它們,你可以嘗試這樣的轉換。節省猴子補丁。前進到新的架構。

import this.that.module 
import pickle 
import os 
legacy_obj= pickle.load(someFile) 
os.rename(someFile, someFile+".bak") 

import this.that.module.class 
new_obj= this.that.module.class(legacy_obj) 
pickle.save(someFile) 

有1900行的一個文件,文件8+每200條+線之間的中間地帶。 200多行的單個類表明您可能有其他設計問題。在創建8個「每個類1個」文件之前,您可能需要首先解決這些問題。

想象一下200行的課程可能已經做得太多了。你可能想要分解你的類來承擔更多細化的責任。完成之後,您可能會發現您有幾個模塊 - 每個模塊都有幾個類。

您可能想要將相關類的集合分解爲可重用模塊。一個簡單的「每個文件類別」方法可能是一個糟糕的重組方式。

+0

我的課變得很長(1900行!),認爲最好將相關的課程拆分成自己的模塊 – 2010-07-31 21:28:09

2

我通常看到的模塊初始化的.py做這樣的事情:

from whyteboard.tools.pen import * 

這樣,你總是可以從whyteboard.tools導入和引用任何該模塊內的類的不知道去哪裏他們位於。你只需要知道whyteboard.tools包提供的類。

相關問題