该文档暗示可以__new__(cls, ...)
返回不同于cls
. 它说在这种情况下__init__()
不会被调用。它没有明确说明,但常识或简单的测试确认生成的对象不会有 type cls
。
为什么允许这种看似奇怪的行为?用例是什么?这显然是故意的。
该文档暗示可以__new__(cls, ...)
返回不同于cls
. 它说在这种情况下__init__()
不会被调用。它没有明确说明,但常识或简单的测试确认生成的对象不会有 type cls
。
为什么允许这种看似奇怪的行为?用例是什么?这显然是故意的。
当您为单元测试创建模拟对象时,它会很有用。
在某些情况下,您可以更改__new__
方法以返回具有相同接口的另一个对象,作为原始对象(例如模拟原始类实例的行为),而无需修改其余代码。
我猜 Python 的人刚刚决定没有理由强制__new__(cls, ...)
返回cls
. __new__
是一种相当先进的方法,因此用户可能知道他在做什么,并且可能有一些理由来利用这种行为。
不过,他们仍然必须进行检查。在实例创建期间,__init__
应该调用。__new__
仅当实例(从 中返回)确实是时,这才是合理的cls
。如果__new__
返回不同的值,则该对象可能无法处理将传递给的参数__init__
。
最后,__new__
语言的加入给开发人员留下了三个选择:
__new__(cls, ...)
返回一个实例cls
__init__
由返回的实例__new__
,让用户来确保对象可以处理参数。__init__
当实例确实是cls
.我想选项 3 似乎最实用。