孤高の豚ではありません、シングルトンです。
シングルトンって知っていますか?
…いえ、違います~
デザインパターンの一つで、
「あるクラスのインスタンスが常にたった1つしか存在していない」
のを作りたいときに使うパターンですね~
こんな時に役立ちます~(たぶん)
逆にこんな時は不向きです~
それでは、pythonだとどのように作るのでしょうか?
テンプレートはありそうですけど、
理解深めるために自作したいと思います~
でも、全く0だと作れなさそうだったので、
こちらをパク…参考にしました~
pythonで良い感じのシングルトンを書く - BlankTar
こちらが今回の構成です~
mein subでインスタンス生成をしているのですが、
上記urlを参考に同じインスタンスを使うようにしました~
shingleton |--singleton.py |--main.py |--sub.py
# singleton.py class Singleton: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance
# main.py from singleton import Singleton import sub app = Singleton() print("main_instance:", app)
# sub.py from singleton import Singleton sub_app = Singleton() print("sub_instance:", sub_app)
実行結果がこちら~
$ python main.py sub_instance: <singleton.Singleton object at 0x00000235ED2D2908> main_instance: <singleton.Singleton object at 0x00000235ED2D2908>
お~出来ました~
けど、 super().__new__(cls)
の挙動がよくわかんない…
基底クラスをnewしてるんだけど、
なぜこれでインスタンスが設定できるんでしょうか???
とりあえず、newの挙動が分からないので↓のurlを見たところ…
Python の __new__ ってなに? | Mastering Python
- 第一引数 cls にクラスオブジェクトが代入される。
お、それっぽいことが…newでクラスオブジェクトが入れられるのですね♪
でも、なぜ基底クラスからnewする必要があるのでしょうか…
ここは、ちょっとわかりませんでした…
まあ、シングルトンができたのでよしとしたいと思います~
出来ていない部分はおいおい勉強ですね~