シングルトンパターンを使用して、クラスのインスタンス化の数を1つのオブジェクトに制限できるという印象を受けています。 obj3
とobj4
が同じオブジェクトであることを証明しているベースクラスサブクラスシナリオのシングルトンパターン
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class base1(object):
__metaclass__ = Singleton
class base2(base1):
pass
class base3(base1):
pass
class base4(base2):
pass
obj1 = base4()
obj2 = base4()
print obj1 is obj2 #prints True
obj3 = base3()
obj4 = base3()
print obj3 is obj4 #prints True
print obj1 is obj3 #prints False
まずprint文を印刷True
:そして、心の中でそれを維持する、以下のコードを見てください。しかし、2番目の印刷ステートメントFalse
obj1
とobj3
が同じでないことを証明します。目標を達成するための最善の方法は、"Always return the same base1 object no matter which sub class instantiates it"
です。
なぜあなたもこれらのサブクラスを持っているでしょうか?あなたが本当にシングルトンを実行するメタクラスベースの施行ルートを通過したいのであれば、なぜこれらのサブクラスが存在することを許可していますか? – user2357112
それは意味をなさない!それらのすべてがベースのオブジェクトのみを作成できるようにする必要がある場合、なぜ複数のクラスを作成するのですか?基本クラスのエイリアスが必要なのでしょうか?あなたのコードは、階層内の**クラスごとに1つのシングルトン**を可能にするように特別に作られています。なぜあなたは最初にそのようにプログラムしましたか? – Wombatz