2017-03-01 9 views
0

シングルトンをPythonで実装する方法についての記事を見ましたが、自分でそれをやることができるかどうかを見たいと思っていました。それは私がこれで終わったとされている状態で:シングルトン(Python)

class Singleton: 
    instance = None 
    def __init__(self, attribute): 
      if instance is None: 
       self.attribute = attribute 
       Singleton.instance = self 
      else: 
       self = instance 

s1 = Singleton("s1") 
s2 = Singleton("s2") 
print(s1 is s2) 

print文はFalseをプリントアウトしますが、私はシングルトンに、彼らは両方のポイント思うだろうとして、それは本当ではない、なぜ私はわかりません。

+1

は '交換self'が唯一の変数に新しい値が得られます。インスタンスを置き換えることはありません。 –

答えて

0
  1. 最初に、定義されていないval 'インスタンス'を持つコード。多分あなたは 'Singleton.instance'を書く必要があります。
  2. 8行目では、元の自己valを変更することはできません。新しいvalを作成するだけでselfという名前が付けられます。したがって、print(s1はs2)はFalseになります。

私は、新しいコードを書くのお手伝いをしたい:

class Singleton(object): 
    def __init__(self, attribute): 
     self.attribute = attribute 
    def __new__(cls, *args, **kw): 
     if not hasattr(cls, '_instance'): 
      orig = super(Singleton, cls) 
      cls._instance = orig.__new__(cls, *args, **kw) 
     return cls._instance 

s1 = Singleton("s1") 
s2 = Singleton("s2") 
print(s1 is s2) 
+1

'* args'と' ** kw'を渡すことなく 'cls._instance = orig .__ new __(cls)'行に変更する必要があると思います –