2012-07-26 93 views
5

我對Python提出這個問題,雖然它可能適用於大多數OOP語言。爲「只有一個實例」創建一個Python類?

當我只希望在任何程序中使用的數據模型,只有一次,我可能要麼使帶班/靜態方法的類和屬性,或者只是做一個普通的類,一旦實例並只使用一個副本。在這種情況下,哪種方法更好,爲什麼?

使用python,我也可以編寫一個模塊並像使用類一樣使用它。在這種情況下,哪種方式更好,爲什麼?

例如:我想有一箇中央數據結構來訪問/保存數據到文件。

模塊方式:

data.py

attributes = something 
... 
def save(): 
... 

main.py

import data 
data.x = something 
... 
data.save() 

類的方法:

class Data: 
    attributes = something 
    @classmethod 
    def save(cls): 

Data.x = something 
Data.save() 

實例方式

class Data: 
    def save(self): 

data = Data() 
data.x = something 
data.save() 
+4

爲什麼downvote?這是一個合法的編程問題。 – darkfeline 2012-07-26 05:59:00

+1

單身python的搜索stackoverflow – warvariuc 2012-07-26 06:13:30

+2

修改後的問題好多了。我認爲目前沒有關閉(除了重複)。 – 2012-07-26 06:20:53

回答

5

的模塊是指以包圍共同結構的「命名空間」。但是真正在Python中,模塊只是一個文件,你可以根據需要組織它們。有些人在一個模塊中放置了很多功能。有些人把它們分散在軟件包或子軟件包上。取決於你想要的可重用性。如果一個模塊具有大量的依賴關係,並且您希望重新使用一小部分,那麼將它們分開是有意義的。

一個類允許你定義可以作爲子類型繼承的類型。他們還可以讓你爲每個類的實例定義一個狀態。

當你的類沒有狀態,只有staticmethods/classmethods,機會是你不需要的類。你只需要功能。

此外,你不能創建一個模塊,並像一個類一樣使用它。一個模塊不能有子類。它們在加載時只有一個基本模塊init,然後是一個對象範圍。

如果你所追求的是常數,這意味着他們的應用程序的生命定義一次,然後就創建了一堆原始的類型,如字符串,類型的字典和列表的constants.py模塊。

+1

你可以使用一個模塊有點像類(見我的例子),雖然它似乎有點hackish。我正在尋找狀態和方法,但我只需要一個實例,所以我使用類或實例? – darkfeline 2012-07-26 06:02:02

+0

您僅在其範圍內使用該模塊。除了作爲模塊對象外,它不像一個類。任何對象都可以有屬性。 – jdi 2012-07-26 06:03:53

+0

狀態和方法有時會提示Singleton模式。雖然有些人認爲他們是不好的風格。如果它具有狀態和設置並且需要特定的功能,那麼它可以是一個普通的類。你應該避免擁有積極修改全局變量的結構。常量通常只能讀取 – jdi 2012-07-26 06:05:48

2

標準的隨機模塊實現具有良好的設計,可以顯示模塊級別的實例創建和使用,而不會強制任何用戶使用單例。

例如,如果我稱之爲random.random()它使用Random類的一個隱藏的實例,其在進口時進行初始化。如果我對默認不滿意,我可以

​​

然後有一個生成器不會與隱藏實例共享狀態。如果您對這種方法感興趣,請參閱random.py,這是非常有據可查的;只有少數相關的代碼行並不那麼棘手。

這種方法給單身人士帶來了一個有趣的Pythonic扭曲:自動構建一個導入,但不阻止我實例化更多,如果我想。

相關問題