-1

我有两个单例子类 A 和 B,它们的数据需要单独维护。当一个子类 A 使用超类时,一些信息将存储在超类的 list 和 dict 中。但是当我尝试从另一个子类 B 调用超类时,子类 A 存储的信息会导致问题。

是否可以为 A 和 B 子类提供单独的超类实例。

(我用 self 作为超类成员)

4

3 回答 3

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 回答
1

我不确定我是否完全理解您的问题,部分原因是您的问题中没有包含任何代码。因此,仅基于我对您所写描述的解释,我认为以下内容将解决两个单例子类相互干扰的问题。

通用 Singleton元类用于定义基本单例类。元类确保为自己的每个单例类实例创建一个单独的单个实例——即MySingletonBase在这种情况下是你的——这正是我认为你想要的。从它派生的两个子类AB将从基类继承这个元类,因此将具有它们的单例超类的独立实例。

下面的代码基于我对以下问题的回答之一:
     如何初始化单例派生对象一次?

# 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 回答
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 回答