Pythonでシングルトンに関するコードを見ているときに、自分でコードを書くことにしました。
これが私の最初のコードでした:
def singleton(cls):
instance = False
def constructor(*args,**kwargs):
if not instance:
instance = cls(*args,**kwargs)
return instance
return constructor
しかし、私がそれをテストしたとき、インタプリタは、if条件で使用される前に「インスタンス」を宣言する必要があると私に言いました、最終的に私は次のようにそれを行うことを理解しました:
def singleton(cls):
cls._instance = False
def constructor(*args,**kwargs):
if not cls._instance:
cls._instance = cls(*args,**kwargs)
return cls._instance
return constructor
そしてそれは期待通りに機能しました:
>>> @singleton
>>> class A: pass
>>> a=A()
>>> id(a)
33479456
>>> b=A()
>>> id(b)
33479456
最初の例のクロージャーが機能しなかった理由。
編集:エラーは
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "singleton.py", line 4, in constructor
if not instance:
UnboundLocalError: local variable 'instance' referenced before assignment