我有两个单例子类 A 和 B,它们的数据需要单独维护。当一个子类 A 使用超类时,一些信息将存储在超类的 list 和 dict 中。但是当我尝试从另一个子类 B 调用超类时,子类 A 存储的信息会导致问题。
是否可以为 A 和 B 子类提供单独的超类实例。
(我用 self 作为超类成员)
我有两个单例子类 A 和 B,它们的数据需要单独维护。当一个子类 A 使用超类时,一些信息将存储在超类的 list 和 dict 中。但是当我尝试从另一个子类 B 调用超类时,子类 A 存储的信息会导致问题。
是否可以为 A 和 B 子类提供单独的超类实例。
(我用 self 作为超类成员)
基类的数据成员在 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
您观察到的问题可能与其他问题有关
我不确定我是否完全理解您的问题,部分原因是您的问题中没有包含任何代码。因此,仅基于我对您所写描述的解释,我认为以下内容将解决两个单例子类相互干扰的问题。
通用 Singleton元类用于定义基本单例类。元类确保为自己的每个单例类实例创建一个单独的单个实例——即MySingletonBase
在这种情况下是你的——这正是我认为你想要的。从它派生的两个子类A
和B
将从基类继承这个元类,因此将具有它们的单例超类的独立实例。
下面的代码基于我对以下问题的回答之一:
如何初始化单例派生对象一次?
# 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
的方法。
感谢您的答复,
我犯的错误是我在错误的地方声明了基类成员 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])