Python

Python デザインパターンを学ぶ Singletonパターン

概要

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