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__
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |