11.5.4クラスデコレーター②

・例 シングルトーンパターン

>>> def singleton_deco(cls): ... __instance = None ... #インスタンスを返すファクトリー関数 ... def inner(*args, **kwargs): ... nonlocal __instance ... if __instance is None: ... __instance = cls(*args, **kwargs) ... return __instance ... return inner ... >>> @singleton_deco ... class MyClass: ... pass ... >>> if __name__ == '__main__': ... c1 = MyClass() ... c2 = MyClass() ... print(c1 is c2) ... True

  • 1.シングルトンデコレーターの定義:

    • singleton_deco という名前の関数を定義しています。この関数は引数としてクラス cls を受け取ります。

    • このデコレーターの目的は、同じクラスから生成されるインスタンスが1つだけであることを保証する「シングルトンパターン」を実装することです。



  • 2.インスタンス格納の変数:

    • __instance = None: この変数は、生成された唯一のインスタンスを格納するためのものです。



  • 3.ファクトリー関数の定義:

    • def inner(*args, **kwargs):: クラスのインスタンスを生成する代わりに、この内部関数が呼び出されるようになります。

    • nonlocal __instance: 外部関数の変数 __instance を参照・変更できるようにするための宣言です。



  • 4.シングルトンのチェック:

    • if __instance is None:: すでにインスタンスが存在しない場合、新しいインスタンスを生成します。

    • __instance = cls(*args, **kwargs): インスタンスがまだ存在しない場合、新しいインスタンスを作成して __instance に格納します。



  • 5.ファクトリー関数の返り値:

    • return __instance: シングルトンインスタンスを返します。



  • 6.デコレーターの適用:

    • @singleton_deco: この行で singleton_deco デコレーターを MyClass に適用しています。



  • 結果の確認:

    • c1 = MyClass(): MyClass のインスタンスを取得(または作成)します。

    • c2 = MyClass(): 再び MyClass のインスタンスを取得します。デコレーターが正しく機能していれば、最初に作成されたインスタンスが返されるはずです。

    • print(c1 is c2): 2つのインスタンスが同一であるかどうかを確認します。

結果:

True が表示されることで、シングルトンデコレーターが正しく動作し、同じクラスから生成されるインスタンスが1つだけであることが確認できます。