这可能是一个愚蠢的问题,但我很想知道答案。
根据官方文件,__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)
__init__()
不是一个正常的函数。它是 Python 用于自定义类实例的特殊方法。它是一部分Python的数据模型 https://docs.python.org/2/reference/datamodel.html#object.__init__:
创建实例后调用(通过__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 https://stackoverflow.com/users/205580/eryksun提供了一个很好的解释:
要完整地解释这个故事,你必须回到元类__call__
方法。特别是默认的type.__call__ https://github.com/python/cpython/blob/e9f9b042781e3cb480315860bcdf7b7d22cba0f8/Objects/typeobject.c#L737在 CPython 调用中__new__
and __init__
通过他们的C槽函数,它是slot_tp_init
(定义于对象/typeobject.c https://github.com/python/cpython/blob/e9f9b042781e3cb480315860bcdf7b7d22cba0f8/Objects/typeobject.c#L5828) 强制返回值为 None。如果您使用覆盖的自定义元类type.__call__
,它可以手动调用__new__
and __init__
类的方法,不限制什么__init__
可以回来——尽管这很愚蠢。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)