9

该文档暗示可以__new__(cls, ...)返回不同于cls. 它说在这种情况下__init__()不会被调用。它没有明确说明,但常识或简单的测试确认生成的对象不会有 type cls

为什么允许这种看似奇怪的行为?用例是什么?这显然是故意的。

4

2 回答 2

5

当您为单元测试创​​建模拟对象时,它会很有用。

在某些情况下,您可以更改__new__方法以返回具有相同接口的另一个对象,作为原始对象(例如模拟原始类实例的行为),而无需修改其余代码。

于 2012-04-18T09:05:30.223 回答
4

我猜 Python 的人刚刚决定没有理由强制__new__(cls, ...)返回cls. __new__是一种相当先进的方法,因此用户可能知道他在做什么,并且可能有一些理由来利用这种行为。

不过,他们仍然必须进行检查。在实例创建期间,__init__应该调用。__new__仅当实例(从 中返回)确实是时,这才是合理的cls。如果__new__返回不同的值,则该对象可能无法处理将传递给的参数__init__

最后,__new__语言的加入给开发人员留下了三个选择:

  1. 强制__new__(cls, ...)返回一个实例cls
  2. 始终调用__init__由返回的实例__new__,让用户来确保对象可以处理参数。
  3. __init__当实例确实是cls.

我想选项 3 似乎最实用。

于 2012-04-18T10:02:19.283 回答