何时调用Python的super().__ init __()?

时间:2014-11-15 14:34:06

标签: python python-3.x subclass super

(在谷歌搜索之后,我无法在任何地方找到参考资料。)

这个简短的代码示例可以清楚地展示这个场景:

class X:
    def __init__(self, stuff):
        self.__stuff = stuff

class Y(X):
    def __init__(self, stuff):
        # Is it safe to execute statements before calling super.__init__()?
        new_stuff = self.call_another_method(stuff)
        super(Y, self).__init__(new_stuff)

使用CPython 3.x,上面的代码示例有效 - 假设存在call_another_method()。这种编码风格通常是安全的,但不赞成或被认为是unPythonic?我无法就此事找到建议。

为什么我在乎?

我的背景来自更传统的面向对象编程语言,例如C ++,C#和Java,其中" super"必须严格地调用为子类构造函数中的第一个语句 - 忽略零参数,隐式大小写。

如果重要的话,我年轻的Pythoneer:3+,拜托。

1 个答案:

答案 0 :(得分:11)

是的,在super()之前调用其他内容是完全安全的。 Python没有设置顺序,并且有很多用例。

请注意super().__init__()调用只是Python中的另一个表达式,它不是语法结构。您也可以使用super()外部方法,例如,如果您传入正确的参数。

在您的情况下,您可以省略类型和实例参数,Python 3将在没有参数的情况下调用super()时为您检索这些参数,因为您在类中定义的函数中使用它:

class Y(X):
    def __init__(self, stuff):
        new_stuff = self.call_another_method(stuff)
        # super(Y, self) is implicit here:
        super().__init__(new_stuff)