【发布时间】:2020-04-06 13:21:22
【问题描述】:
我正在尝试按照here(方法 2)的描述实现类继承的单例。回顾了这个问题和extensive chosen answer,我尝试实现以下内容:
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not isinstance(cls._instance, cls):
cls._instance = object.__new__(cls, *args, **kwargs)
cls._instance._initialized = False
return cls._instance
class A(Singleton):
def __init__(self):
print "Init is called"
class B(Singleton):
def __init__(self):
print "Init is called"
正如您可能猜到的,每当我创建 Class A 时,我都会得到相同的对象,但会调用 __init__。这是有问题的,因为 Class A 可能因此而更改其所有成员。
在做:
a1 = A()
a2 = A()
print a1 == a2
将导致:
>> Init is called
>> Init is called
>> True
This question 提出了类似的问题,但我不想在那里使用该解决方案,因为它不包括继承,而且我至少有 2 个需要Singleton 继承的类。我尝试实施解决方案here,但没有奏效。 solution here 有效,但它涉及更改 Class A 和 Class B,我不希望这样做。
有没有办法改变Singleton 的实现,使__init__ 不会在每次创建时都被调用? (我不能使用元类,因为A 和B 都继承了其他类,例如具有自己的元类的抽象类)。
谢谢
【问题讨论】:
标签: python python-2.7 inheritance singleton metaclass