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

时间:2017-06-09 03:57:46

标签: python python-2.7 oop

这可能是一个愚蠢的问题,但我很想知道答案。 根据官方文档,__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)

2 个答案:

答案 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__没有理由能够返回任何值 - 这根本不是他们的用例。