質問にコードが含まれていないこともあり、問題を完全に理解しているかどうかはわかりません。したがって、あなたが書いた説明の私の解釈のみに基づいて、以下は互いに干渉する2つのシングルトンサブクラスの問題に対処すると思います.
ジェネリック シングルトンメタクラスは、ベース シングルトン クラスを定義するために使用されます。メタクラスは、それ自体のシングルトンクラスインスタンスごとに個別の単一インスタンスが作成されることを保証します。つまりMySingletonBase
、この場合はあなたのものです。そこから派生した 2 つのサブクラスA
とB
は、ベースクラスからこのメタクラスを継承するため、シングルトン スーパークラスの独立したインスタンスを持つことになります。
以下のこのコードは、次の質問に対する私の回答の 1 つに基づいています:
シングルトン派生オブジェクトを一度初期化する方法は?
# singleton metaclass
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 MySingletonBase(object):
__metaclass__ = Singleton
def __init__(self):
self.values_list = []
def test_method(self, value):
self.values_list.append(value)
def total(self):
return sum(self.values_list)
class A(MySingletonBase): pass
class B(MySingletonBase): pass
a1 = A()
b1 = B()
a2 = A()
a1.test_method(42)
a2.test_method(13)
print '{}, {}'.format(a1.values_list, a1.total()) # [42, 13], 55
print '{}, {}'.format(a2.values_list, a2.total()) # [42, 13], 55
print '{}, {}'.format(b1.values_list, b1.total()) # [], 0
出力は、 subclass のインスタンスA
が確かにシングルトンであり、 subclass で作成されたインスタンスとは別のものであるにもかかわらず、両方とものメソッドB
を継承していることを示しています。MySingletonBase