2016-11-04 26 views
0

我一直在尋找在Python中Singleton設計模式在這裏:http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html如果Python不能有私有方法那麼如何辛格爾頓工作

class OnlyOne: 
    class __OnlyOne: 
     def __init__(self, arg): 
      self.val = arg 
     def __str__(self): 
      return repr(self) + self.val 
    instance = None 
    def __init__(self, arg): 
     if not OnlyOne.instance: 
      OnlyOne.instance = OnlyOne.__OnlyOne(arg) 
     else: 
      OnlyOne.instance.val = arg 
    def __getattr__(self, name): 
     return getattr(self.instance, name) 

我在想,在Java中,Singleton模式是使用私有實現構造函數。

但是,在上面的代碼中沒有私有構造函數,據我所知,Python中沒有私有方法。

所以如果你想實現Singleton,你怎麼能阻止某人多次實例化一個類?

+1

在Python中,您可以覆蓋'__new__',以便在有人試圖實例化它時返回現有對象。你實際上鍊接到的一個例子就是這樣做的,儘管不是你引用的那個例子。 – khelwood

+0

這是一個協議,你不應該直接調用諸如'__foo__'或像'__Foo'這樣的類的方法,因爲[它們被認爲是私有的](https://stackoverflow.com/questions/1641219/does-python-have -private-variables-in-classes) – CoryKramer

+2

呃,這是python中單例的一個不好的實現。正如@ khelwood所建議的那樣,正確的方法是使用'__new__''。 –

回答

2

您發佈的密碼有instance這是一個班級成員。由於__init__會檢查此類成員,因此您可能有多個OnlyOne實例,但它們都共享相同的__OnlyOne實例。

0

將會有幾個不同的OnlyOne實例。

但是,只有一個內部類的實例__OnlyOne存儲爲OnlyOne上的類變量。

OnlyOne實例上的所有屬性查找實際上都會返回__OnlyOne實例的屬性值(這就是__getattr__方法所做的)。

我從來沒有見過使用過這種模式,通常人們通過創建一個模塊全局變量來創建一個單例,然後在任何地方使用它。