我的想法是单例类的所有子类都应该存在任何一个对象。 我一直在尝试的代码和结果矩阵如下所示。在子类的情况下,矩阵似乎运行良好。我是不是走错了方向?在父类对象和子类对象的情况下,它发生了什么?
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(
cls, *args, **kwargs)
return cls._instance
class A(Singleton):
def __new__(cls, *args, **kwargs):
super(A, cls).__new__(cls, *args, **kwargs)
class B(Singleton):
def __new__(cls, *args, **kwargs):
super(B, cls).__new__(cls, *args, **kwargs)
class C(B):
def __new__(cls, *args, **kwargs):
super(B, cls).__new__(cls, *args, **kwargs)
if __name__ == '__main__':
s1=Singleton()
s2=Singleton()
if(id(s1)==id(s2)):
print "Same"
else:
print "Different"
'''
I got a result matrix for s1 and s2
|************ s2 **************************|
s1 |Singleton() |A() | B() | C() |
===========|==========================================|
Singleton()|Same |Different|Different|Different|
A() |Different |Same |Same |Same |
B() |Different |Same |Same |Same |
C() |Different |Same |Same |Same |
'''
class A(object): ...
然后立即创建一个全局实例a = A()
呢?你将获得一个看起来像单个全局实例的单个全局实例,并且它在完全相同的作用域中可用。如果您想要懒惰初始化,有方法可以实现这一点,看起来就像您正在执行此操作。 - Bens1=Singleton()
然后s2=A()
,那么它们都将是同一个对象(Singleton
的实例),但如果你执行s1=A()
然后s2=Singleton()
,那么它们将是不同的对象(分别是A
和Singleton
的实例)。 - BenA().method_of_a()
将根据Singleton
是否已经实例化而工作、抛出异常(或莫名其妙地调用超类实现)。我无法想象这可能是期望的行为;您打算如何处理这个单例类层次结构? - Ben