2016-06-21 10 views
1

我已經閱讀說明如何實現單在蟒蛇,就像 Creating a singleton in Python不是類方法和屬性的類是python中的單例嗎?

我想知道很多文章,是不是類方法的類和屬性是一個單例類。

例如

class my_singleton_class(object): 

    _logger = Logger() 
    _printer = Printer() 

    @classmethod 
    def logger(cls): 
     return cls._logger 

    @classmethod 
    def printer(cls): 
     return cls._printer 

它不是pythonic?這個單例實現有什麼問題?

+0

你應該看看這個:http://stackoverflow.com/questions/1318406/why-is-the-borg-pattern-better-than-the-singleton-pattern-in-python – phogl

回答

6

我想知道,是不是類方法和屬性是一個單例類。

通過定義一個單獨的類是你不能創建超過1個實例類。

讓我們把它放到測試:

class my_singleton_class(object): 
    _logger = 1 
    _printer = 2 

    @classmethod 
    def logger(cls): 
     return cls._logger 

    @classmethod 
    def printer(cls): 
     return cls._printer 

print(id(my_singleton_class())) 
print(id(my_singleton_class())) 
>> 8322128 
>> 8322192 

很明顯,我們成功地創建該類的2個不同的實例。

這些實例具有共享屬性的事實並不會使此類成爲單例。

+0

單身意味着資源應該共享,不應該有像記錄器或打印機那樣的多個資源實例? – deepak

+0

儘管如此,兩個實例並不會被迫共享資源。創建後,您可以獨立創建並分配給每個實例的任意屬性。 'a = my_singleton_class(); b = my_singleton_class(); a.foo =「bar」; b.x = 3'。 – chepner

+0

@DeepSpace根據您的實現,您創建的兩個匿名實例*可能*具有相同的ID,因爲第二個可以重用之前由第一個佔用的內存。 – chepner

1

從技術上講,你的例子不是單例。單例是一個將在整個應用程序中訪問的類的唯一實例。在Python中,單例類是隻能構建一個單一實例的類。

但是,您的類可以用作單例,因爲您將直接使用類本身而不是使用單例對象。

logger = my_singleton_class.logger() 

這是每種語言允許的,我可以看到沒有立即或嚴重的警告。所以恕我直言,無論是pythonic還是nor都不是口感問題。

相關問題