关于python中父类__new__()被改写所产生的影响的疑问

img

img


为什么第三个的output不是C中的init中的print呢?

因为Python中的多态性,基类A和子类B的 init() 方法会被引用,但是无论何时只会调用最近定义的一个方法。当调用C的 init() 时,会产生上溯到B的 init() 方法,所以最后输出的是B的 init() 方法中定义的print语句。

你可以参照官方文档的解释。
里面有提到,当__new__方法没有返回新的实例时,__init__方法就不会被执行。
所以如果在B类的__new__方法的末尾添加:

return super().__new__(self)

这样调用父类的__new__方法,就会输出(自己输代码的时候简化了一下):

A __init__
B __new__
B __init__
B __new__
C __init__

你下面两个__init__的格式是不是写错了?按理会调用,你把A中的复制到b和c中。注意这两个短_ 很容易搞错。