我的想法是任何一個對象都應該存在於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