为什么 python 的 __init__ 函数没有 return 语句,即使它是一个函数

Kir*_*iah 4 python oop python-2.7

这可能是一个愚蠢的问题,但我很想知道答案。根据官方文档,__init__不需要 return 声明。有什么特殊原因会这样吗?

>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)

>>> x.r, x.i
(3.0, -4.5)
Run Code Online (Sandbox Code Playgroud)

Chr*_*ean 5

__init__()不是一个正常的函数。它是 Python 用于自定义类实例的特殊方法。它是Python 数据模型的一部分:

在创建实例之后(通过__new__())但在将其返回给调用者之前调用[...]。

从上面可以看出,当你创建一个类的新实例时,Python 首先调用__new_()(这也是一个特殊的方法)来创建该类的新实例。然后__init__()调用来定制新实例。

从 中返回任何内容都是没有意义的__init__(),因为类实例已经创建。事实上,Python 甚至引发了一个错误来防止这种情况发生:

>>> class A:
...     def __init__(self):
...         return 'foo'
... 
>>> A()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() should return None, not 'str'
>>> 
Run Code Online (Sandbox Code Playgroud)

如果你想知道幕后到底发生了什么,@eryksun提供了一个很好的解释:

要完整地解释这个故事,您必须回到元类__call__方法。特别type.__call__是 CPython 调用中的默认值__new__以及__init__通过它们的 C 槽函数,它(在Objects/typeobject.cslot_tp_init中定义)强制返回值为 None。如果您使用重写的自定义元类,它可以手动调用该类的和方法,而不会限制返回内容——尽管这很愚蠢。type.__call____new____init____init__