是否有必要在 python 中显式调用 super().__init__()?

Is it necessary to call super().__init__() explicitly in python?

提问人:Some Name 提问时间:2/1/2020 更新时间:2/1/2020 访问量:6714

问:

我来自Java,在那里我们可以避免调用超类零参数构造函数。对它的调用由编译器隐式生成。

我读了这篇关于 super() 的文章,现在想知道是否真的有必要明确地做这样的事情:

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__() #Do we get some Undefined Behavior if we do not call it explicitly?
python-3.x 继承 构造函数

评论

4赞 Sayse 2/1/2020
如果你省略了“世界”,它会被打印出来吗?
0赞 Some Name 2/1/2020
@Sayse 问题不在于特定 python 实现的行为。这是关于一般的合法性。
4赞 Sayse 2/1/2020
是的,但答案应该很清楚它是否打印
2赞 Sayse 2/1/2020
世界不会被打印出来。
2赞 MisterMiyagi 2/1/2020
省略 super init 不是 UB,就像省略任何其他调用一样。对象在 init 之前已明确定义。

答:

20赞 tripleee 2/1/2020 #1

如果重写超类的方法,则子类的方法需要显式调用它,如果这是预期的行为,是的。__init____init__

你的心智模型不正确;它不是构造函数方法,而是构造函数方法调用的钩子,可让您轻松自定义对象初始化。(实际的构造函数是被调用的,但你不需要知道这一点,而且可能永远不需要直接与它交互,更不用说更改它了。__init____new__