这可能是一个愚蠢的问题,但我很想知道答案。
根据官方文档,__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)
答案 0 :(得分:4)
__init__()
不是正常功能。这是Python用于自定义类实例的特殊方法。它是Python's data model的一部分:
在创建实例后(通过
__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'
>>>
如果您想知道幕后究竟发生了什么,@eryksun提供了一个很好的解释:
要完整地解释这个故事,您必须回到元类
__call__
方法。特别是CPython中的默认type.__call__
通过其C槽函数调用__new__
和__init__
,并且它slot_tp_init
(在Objects/typeobject.c中定义)强制返回值为None。如果您使用覆盖type.__call__
的自定义元类,则可以手动调用该类的__new__
和__init__
方法,而不会限制__init__
可以返回的内容 - 这是愚蠢的就像那样。
答案 1 :(得分:1)
__init__
。
它的主要用途是初始化实例变量,并且只能使用实例调用它 - 因此在创建实例之前无法调用它(自动触发它)。
由于这些原因,__init__
没有理由能够返回任何值 - 这根本不是他们的用例。