我習慣於Java模型,每個文件可以有一個公共類。 Python沒有這個限制,我想知道組織類的最佳做法是什麼。我應該在一個文件中放入多少個類?
回答
一個Python文件被稱爲「模塊」,它是組織軟件的一種方式,以使其「有意義」。另一個是名爲「包」的目錄。
模塊是一個獨特的東西,可能有一兩個緊密相關的類。訣竅是一個模塊是你要導入的東西,你需要這個導入對於那些會讀取,維護和擴展你的軟件的人來說是非常明智的。
規則是這樣的:模塊是重用單元。
您無法輕鬆重用單個類。您應該可以毫無困難地重用模塊。庫中的所有內容(以及下載和添加的所有內容)都是模塊或模塊包。
例如,您正在研究讀取電子表格,執行一些計算並將結果加載到數據庫中的內容。你想讓你的主程序看起來像什麼?
from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader
def main(sourceFileName):
rdr= Reader(sourceFileName)
c1= ACalc(options)
c2= AnotherCalc(options)
ldr= Loader(parameters)
for myObj in rdr.readAll():
c1.thisOp(myObj)
c2.thatOp(myObj)
ldr.laod(myObj)
將導入看作是在概念或塊中組織代碼的方式。每個導入中究竟有多少類並不重要。重要的是你用你的import
陳述描繪的整個組織。
哈哈,我喜歡引用中的「意義」。 – cdleary 2009-07-07 11:30:45
@cdleary:一個人的感覺是另一個人的瘋狂。通常,你可以定義明智的模塊。然而,在一個大的應用程序中,總是存在多個分析維度,一個人會將頭髮分割爲另一個人的功能分割和切割。 – 2009-07-07 12:46:10
我會說放置儘可能多的類,可以在邏輯上分組在文件中,而不會太大而複雜。
由於沒有人爲的限制,它真的取決於什麼是可理解的。如果你有一堆相當簡短的,按邏輯分組在一起的簡單類,可以折騰一堆。如果你有大而複雜的班級或班級,那麼這些班級或班級就不適合作爲一個羣組,每個班級只能有一個文件。或者在中間挑選一些東西。隨着事物的改變重構。
這完全取決於項目有多大,類有多長,如果從其他文件中使用它們等等。
例如,我經常使用一系列的數據抽象類 - 所以我可能有4或5類,可能只有1行(class SomeData: pass
)。
這將是愚蠢的每一種分成單獨的文件 - 但因爲他們可以從不同的文件中使用,把所有這些在一個單獨的data_model.py
文件將是有意義的,所以我可以做from mypackage.data_model import SomeData, SomeSubData
如果您有一個有很多代碼的類,也許只有它使用的一些函數,將這個類和輔助函數分割成一個單獨的文件是個好主意。
,這樣你就from mypackage.database.schema import MyModel
,不from mypackage.email.errors import MyDatabaseModel
你應該構建他們 - 如果你在哪裏有意義進口的東西,文件不長線路的成千上萬,你已經正確地組織它。
Python Modules documentation有關於組織軟件包的一些有用信息。
我碰巧喜歡Java模型,原因如下。將每個類放在單獨的文件中可以在瀏覽源代碼時更容易看到類,從而促進重用。如果你有許多類被分組到一個單獨的文件中,其他開發者可能並不清楚那裏有哪些類可以通過瀏覽項目的目錄結構來重用。因此,如果你認爲你的類可能會被重用,我會把它放在它自己的文件中。
我發現自己分裂的東西,當我厭倦了文件的龐大性,當相關性的理想結構開始出現自然。通常這兩個階段似乎是一致的。
如果您將事情分解得太早,可能會非常煩人,因爲您開始意識到需要完全不同的結構排序。
另一方面,當任何.java或.py文件達到超過約700行時,我開始不停地試圖記住「那個特定位」在哪裏。使用Python/Jython導入語句的循環依賴似乎也扮演着一個角色:如果您嘗試將太多合作基礎構建塊拆分爲單獨的文件,該語言的「限制」/「不完美」似乎迫使您分組的事情,可能是一個相當明智的方式。至於分解成軟件包,我並不真正知道,但我可能會說,同樣的煩惱和快樂結構的出現在各個模塊級別上都是如此。
- 1. 應該將多少個子目錄放入一個目錄
- 2. 一個類應該包含多少行?
- 3. 有多少文本可以放入一個string.xml文件中?
- 4. 我應該把一個線程類放入一個類方法還是放在一個方法外
- 5. XmlSerializer/StreamWriter將多個類型/類放入同一個xml文件
- 6. 我應該將許多函數放入一個文件嗎?或者,或多或少,每個文件一個函數?
- 7. 我應該寫多少個try&catch塊?
- 8. 我應該創建多少個線程?
- 9. 我應該有多少個S3水桶?
- 10. 我應該創建多少個DTO?
- 11. 我應該有多少個DBContext
- 12. 我應該在python中插入一個工具的文件夾?
- 13. 我應該把我的日誌文件放在一個asp.net應用程序中?
- 14. 每個反應組件應該放在單個文件中嗎?
- 15. 我應該在Symfony2中放置一個ImageManager類?
- 16. 在Laravel中,我應該放置一個非public Data.json文件的文件夾?
- 17. 一個DataSet應該代表多少?
- 18. 一個TestCase應該覆蓋多少?
- 19. 我應該存儲同一個文件的多個實例嗎?
- 20. xcode編程,我應該把我的.xib文件放入哪個文件夾?
- 21. 我應該在我的.py文件中放入ntlk.download()嗎?
- 22. 在哪個目錄中應該放置我的.php文件
- 23. 我應該將我的Angular文件放在同一個JEE項目中嗎?
- 24. 你應該在MongoDB中嵌入多少?
- 25. 應該在構造函數中放入多少代碼?
- 26. PHP腳本應該在同一個文件中有多個類嗎?
- 27. 我應該創建多少個依賴注入容器?
- 28. 在哪個類中我應該把操作放在UML中
- 29. 在POSIX.1中,我應該在多個頭文件中定義類型?
- 30. 如果我把EJB放在一個EAR文件中,我應該把實體類放在那裏,一個單獨的jar還是這個web應用程序?
我認爲這是一個合理的*問題*考慮到其他語言的要求和約定,*答案*是「<定義Python模塊和程序包>而且它是一個偏好問題(/意見)」 - *答案*本身不是一個意見 – d3vid 2016-05-26 13:47:29