2010-01-19 67 views
29

我一般對Python很新。我應該在自己的.py文件中創建每個類嗎?

我知道我可以在同一個.py文件中創建多個類,但是我想知道是否應該在它自己的.py文件中創建每個類。在C#中,例如,我將有一個處理所有數據庫交互的類。然後是另一個擁有商業規則的課程。

這是Python的情況嗎?

回答

25

編號。典型的Python風格是將相關的類放在同一個模塊中。可能是一個班級以自己的模塊結束(尤其是如果它是一個大班級),但它本身不應該是一個目標。當你這樣做的時候,請不要在課後給單元命名 - 你最終會把自己和其他人弄混淆,哪個是哪個。

+4

來自Java我有同樣的問題,男孩是我困惑了一陣子。 :-) – snarkyname77 2010-01-20 00:54:15

+0

有趣的是,PyDev爲您提供了選擇。 – Uri 2010-01-20 14:54:19

+0

如果您從多個類文件中導入類,解釋器不會執行該文件中的所有類嗎? – 2017-06-08 14:09:59

8

每個.py文件都代表一個模塊,因此您應該將函數,常量和類的邏輯組保存在同一個文件中。

在.py文件的每個類只會在你的模塊表中創建史詩般的膨脹,因爲如果你只是在一個類中,你仍然可以

from whatever import SomeClass 
+7

Python風格通常對模塊名稱使用'小寫字母'和類名稱使用'CapWords':http://www.python.org/dev/peps/pep-0008/ – 2010-01-19 23:56:07

+0

你絕對正確,我會編輯。 – richo 2010-01-20 01:46:38

+0

有時候風格很傻。如果你有一個Foo類,請繼續將它放在模塊Foo.py中。你爲什麼要把它放在小寫foo.py中?那麼你可以寫'從foo import Foo'?通過在模塊中寫入__all__ = ['Foo']',你可以輸入'from foo import *'或'from Foo import *',這樣就不會有任何混淆。如果小寫模塊名稱只包含一個類,那麼它們很愚蠢。 – 2011-01-12 18:31:45

1

可能不感興趣。 Python文件是「模塊」。模塊應該包含哪些代碼是獨立可重用的。如果這包括幾個班級,這是常態,那麼這很完美。

3

另一點值得一提的是,如果一個文件變得太大,您可以隨時將其轉換爲一個包,使得在不破壞客戶端代碼的情況下輕鬆重新組織。

+0

一個包只是多個文件(多個模塊)。所以你的答案基本上是說,是的,當代碼量太大時,每個類都應該在它自己的文件(模塊)中。 – 2011-01-12 18:27:54

2

我會不同意其他人並說是。對於我來說,我已經將每個類放在自己的文件(模塊)中取得了更好的成績。但也有例外,所以讓我以一個例子來解釋。

如果你有一個類Foo,然後把它放在一個名爲Foo.py文件,其中包含以下部分:

  1. 進口
    • 這是你在依賴拉。
    • 例子:import mathfrom Bar import *
  2. 全局
    • 這是你定義外部接口到你的模塊,這些都是屬於此模塊的外部可見的符號。
    • 例如:__all__ = ['Foo']
    • 這也是您可以定義全局變量(壞)和全局常量(好)的地方。這些全局變量不需要導出;他們可以通過全球化來簡化代碼。
    • 示例:PI = 3.14159表示您可以編寫PI,而如果您在Foo類中定義了它,則需要編寫Foo.PI
  3. 功能
    • 這是你定義是相關的類Foo所有頂級的功能,但在Foo類的命名空間不屬於。這些可能很少見,因爲課程允許@staticmethods和內部課程。
    • 例子:def print_foo(foo): print(foo)
    • 例子:class Foo(object): pass

有時候你會想放置多個類相同的模塊中。你應該這樣做,只要兩個或兩個以上的班級在概念上與你幾乎總是一起使用而不是獨立的點相關。這是例外,而不是常態。在這種情況下,將全部類名添加到全局的__all__

最後,對於每個模塊Foo.py,都應該有一個相應的單元測試模塊testFoo.py。

1

是每個類都在它自己的文件中。在一個帶有多個類的文件中導入甚至一個類(或函數)會導致python執行文件中所有類的定義。試試這個:

manyClass.py

class foo(): 
    print 'a bunch of time consuming work' 

class tryme(): 
    print 'try me' 

現在,在命令解釋器中鍵入此...

從manyClasses導入tryme

一堆耗時的工作
我試試

相關問題