您的代码不包含任何代码
__new__,因此几乎无话可说。
但是,您将创建一个在创建类时实例化的元类
A。换句话说,该类
A本身就是一个对象,因此是其metaclass的一个实例
Singleton。
因此,让我们看看会发生什么:
之后
A的环境中完成(存在它的方法,它的字典中也存在,…),类被作为元类的实例创建。本质上,电话是
A = Singleton('A', (object,), <the dict>)
其中
<the dict>是包含类的命名空间的字典(这里
__module__,
__metaclass__和
__init__)。
在对的调用中
Singleton,调用将
super(Singleton, self).__call__(*args,**kwargs)导致调用
__new__方法,该方法返回一个新实例,之后在该实例上进行
.__init__调用。
这就是为什么发生这种情况:
calling __init__ of Singleton class <class '__main__.A'>args: ('A', (<type 'object'>,), {'__module__': '__main__', '__metaclass__': <class '__main__.Singleton'>, '__init__': <function __init__ at 0x01F9F7B0>})kwargs: {}
在
A构造之后,可以通过实例化它来使用它:
a = A(10)
这叫
A。
A是的实例
Singleton,因此
Singleton.__call__被调用–效果如下:
running __call__ of Singleton <class '__main__.A'>args: (10,)kwargs: {}
Singleton.__call__呼叫
type.__call__,此呼叫
A.__new__和
A.__init__:
in __init__ of A: <__main__.A object at 0x01FA7A10>self.a: 10
那你做
b = A(20)
该调用
Singleton.__call__:
running __call__ of Singleton <class '__main__.A'>args: (20,)kwargs: {}
在这里,
super调用被取消,并且旧对象被返回。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)