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)
__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__