我的想法是任何一个对象都应该存在于Singleton类的所有子类中。 我一直在尝试的代码和结果矩阵如下。矩阵似乎在子类的情况下工作正常。我走错路了吗?它是否会在父类对象和子类对象的情况下发生什么?python单例类可以被继承吗?
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()'立即创建一个全局实例?您会看到**看起来像单个全局实例的单个全局实例,并且它在完全相同的范围内可用。如果懒惰的初始化是你想要的,那么有办法实现那些实际上*看起来像这就是你正在做的事情。 – Ben
如果你修复了你的子类不返回任何东西的错误,你会得到非常奇怪的行为。如果你做's1 = Singleton()'然后's2 = A()',那么它们都是同一个对象('Singleton'的一个实例),但是如果你做's1 = A()',那么's2 = Singleton()'它们将是不同的对象(分别是'A'和'Singleton'的一个实例)。 – Ben
这意味着在你的程序的某个较远的部分,'A()。method_of_a()'将会工作或抛出一个异常(或者莫名其妙地调用一个超类实现),这取决于“Singleton”是否已经被实例化。我无法想象这是怎样的理想行为;你打算用这个层次的单例类来做什么? – Ben