这里是个人对这些代码的理解,希望能为你提供一些线索:
@Singleton装饰class A 的时候,也就是以class A 作为参数给 Singleton(self._cls),就已经实例化了Singleton类并且命名为A。
然后A.instance()是调用instance()方法把在Singleton类的A里面的self._cls实例化,那么classA 的实例就变成了Singleton类实例A的一个成员属性。 这有点类似于inner class,或者nested class,inner class可以使用外部class的属性和方法,但是应该与继承有区别的。
下面这段应该是这样的:self._decorated其实就是self._cls, 我在下面网页找到类似代码,然后改了self._decorated,运行结果一样,至于为什么会这样我不了解。
http://outofmemory.cn/code-sn...
def __instancecheck__(self, inst):
return isinstance(inst, self._decorated)
__instancecheck__(self, inst):是python的魔法方法,当执行 print(isinstance(s2,A)) 时候就会触发这方法,用以判别其實例是否某class 的实例。
把def instance() 改成这样:
def Instance(self):
self._instance = self._cls()
return self._instance
运行 s1 is s2 会返False。
我们知道没有改之前,因为try except 会让 instance() return self._instance, 如果没有的话就实现一个。 造成 s1 和s2 两个id一样,我的理解应该是同一个instance吧,s1 is s2 返回True。
而改了之后,s1 和s2 就不同id了, 然后 s1 is s2 就返回False。
call 讓 A() 出錯,所以要用instance() 訪問A以實現被decorated 的class