・例 シングルトーンパターン
>>> 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つだけであることが確認できます。
コメント