-1

2 つのシングルトン サブクラス A と B があり、これらのデータは個別に維持する必要があります。1 つのサブクラス A がスーパークラスを使用する場合、一部の情報はリストに格納され、スーパークラスには dict が格納されます。しかし、別のサブクラス B からスーパークラスを呼び出そうとすると、サブクラス A によって保存されている情報が問題を引き起こします。

A と B の両方のサブクラスに対してスーパークラスの個別のインスタンスを持つことは可能ですか?

(スーパークラスのメンバーには self を使用しました)

4

3 に答える 3

1

質問にコードが含まれていないこともあり、問題を完全に理解しているかどうかはわかりません。したがって、あなたが書いた説明の私の解釈のみに基づいて、以下は互いに干渉する2つのシングルトンサブクラスの問題に対処すると思います.

ジェネリック シングルトンメタクラスは、ベース シングルトン クラスを定義するために使用されます。メタクラスは、それ自体のシングルトンクラスインスタンスごとに個別の単一インスタンスが作成されることを保証します。つまりMySingletonBase、この場合はあなたのものです。そこから派生した 2 つのサブクラスABは、ベースクラスからこのメタクラスを継承するため、シングルトン スーパークラスの独立したインスタンスを持つことになります。

以下のこのコードは、次の質問に対する私の回答の 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

于 2013-09-15T17:11:14.160 に答える
1

基本クラスのデータ メンバーはPython で共有されません

class Base(object):
    def __init__(self, x):
        self.x = x

class Derived1(Base):
    def __init__(self, x, y):
        Base.__init__(self, x)
        self.y = y

class Derived2(Base):
    def __init__(self, x, z):
        Base.__init__(self, x)
        self.z = z

d1 = Derived1(10, 20)
d2 = Derived2(30, 40)
print d1.x   # Will show 10
print d2.x   # Will show 30

あなたが観察している問題は、おそらく何か他のものに関連しています

于 2013-09-13T17:40:14.437 に答える
0

ご返信ありがとうございます、

私が犯した間違いは、基底クラスのメンバー list1 を間違った場所で宣言したことです。

class BaseClass(metaclass=Singleton):
    list1 = []
    def __init__(self, a, b, c):
        self.list1.extend([a,b,c])

    def printList(self):
        print(self.list1)

class SubClass1(BaseClass):
    def __init__(self):
        super(SubClass1, self).__init__('a', 'b', 'c')

class SubClass2(BaseClass):
    def __init__(self):
        super(SubClass2, self).__init__('x','y','z')

if '__main__' == __name__:

    s1 = SubClass1()
    s2 = SubClass2()
    s1.printList()
    s2.printList()

init メソッド内で list1 を宣言した後、問題は解決しました

class BaseClass(metaclass=Singleton):
    def __init__(self, a, b, c):
        self.list1 = []
        self.list1.extend([a,b,c])
于 2013-09-16T09:12:08.747 に答える