孤高の豚ではありません、シングルトンです。

シングルトンって知っていますか?

f:id:cacapon:20190517202917j:plain

私は孤高の豚…シングル豚!!



…いえ、違います~
デザインパターンの一つで、
あるクラスのインスタンスが常にたった1つしか存在していない
のを作りたいときに使うパターンですね~

こんな時に役立ちます~(たぶん)

  • データ管理クラス
    インスタンスAで記録していたから、インスタンスBからアクセスできない!
    とか起こりそうです~
    こんな時は一つだけと保証されていると安心ですね~

逆にこんな時は不向きです~

  • ゲームの敵キャラクラス
    →「スライムA,B,Cが現れた!」なんかは複数インスタンスがあってこそ~

それでは、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する必要があるのでしょうか…

ここは、ちょっとわかりませんでした…

まあ、シングルトンができたのでよしとしたいと思います~
出来ていない部分はおいおい勉強ですね~