如果__new__没有返回cls的实例,python不会调用__init__这个事实的设计原因是什么?

Dan*_*ank 5 python

关于为什么python __init__在创建对象后并不总是调用的问题有很多问题.当然,答案可以在文档的摘录中找到:

如果__new__()返回一个实例cls,那么__init__()将调用新实例的方法__init__(self[, ...]),其中self是新实例,其余参数与传递给它的相同__new__().

如果__new__()没有返回实例cls,则__init__()不会调用新实例的方法.

这个的设计原因是什么?

Ste*_*Lin 3

__init__确实像一个构造函数。它需要一个实例来完成其工作,例如设置属性等。如果__new__不显式返回则返回实例,则None默认返回。

__init__想象一下,当获取 aNone作为输入并尝试设置属性时会发生什么?它会引发一个名为的异常"AttributeError: 'NoneType' object has no attribute xxxxx".

__init__所以我认为当返回 None 时不调用是很自然的__new__