概要
Singletonパターン(Singletonの読みは、シングルトン)は、複数のオブジェクトのインスタンスを作成せず、1つのオブジェクトだけ公開する。
このパターンを適用する理由が、単一の.pyファイル(シンプルなクラスレスなモジュール)で満たされるならば、その方がよりシンプルで好ましい。ただしその場合はモジュールは引数を使って構築できず、プロパティは持てない。
また、より古典的なオブジェクト指向のアプローチで、シングルトンのすべてのニーズを満たすことができるため、ボーグパターン(Borg Pattern)が推奨される。
実装例
シングルトンを適用したクラスでは、以下の通り同じインスタンスを使い回す。
class Singleton:
_instance = None
class _Singleton:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
def __init__(self, **kwargs):
if not Singleton._instance:
Singleton._instance = Singleton._Singleton(**kwargs)
else:
for key, value in kwargs.items():
setattr(Singleton._instance, key, value)
def __getattr__(self, name):
return getattr(self._instance, name)
if __name__ == '__main__':
s_instance_1 = Singleton(v=-1, v1="hoge")
s_instance_2 = Singleton(v=42, v2="hello")
print(s_instance_1._instance is s_instance_2._instance) # True
print("v: {}".format(s_instance_1.v == s_instance_2.v == 42)) # True
print("v1: {}".format(s_instance_1.v1 == s_instance_2.v1 == "hoge")) # True
print("v2: {}".format(s_instance_1.v2 == s_instance_2.v2 == "hello")) # True