需要了解__init __,__ new__和__call__的流程

需要了解__init __,__ new__和__call__的流程,第1张

需要了解__init __,__ new__和__call__的流程

您的代码不包含任何代码

__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
调用被取消,并且旧对象被返回。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5566086.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存