Python继承:调用父方法

时间:2018-02-06 10:23:10

标签: python python-2.7 inheritance

在Python 2中,有两种方法可以调用从父类继承的方法。使用super明确表示方法来自父类而没有super

class Parent(object):
    def greet(self):
        print('Hello from Parent')

class Child(Parent):
    def __init__(self):
        super(Child, self).__init__()

    def hello(self):
        print('Hello from Child')
        self.greet()
        super(Child, self).greet()

child = Child()
child.hello()

输出:

Hello from Child
Hello from Parent
Hello from Parent

哪个是首选?我看到社区建议通过super进行调用,但如果没有超级调用则更简洁。

该问题仅适用于Python 2.

1 个答案:

答案 0 :(得分:3)

在您提供的上下文中,从 super(Child, self).greet()内部调用Child.hello 没有意义。

一般情况下,您应该只使用super来调用与您所在的重写方法同名的父类方法。

因此,super中不需要Child.hello,因为您正在调用greet而不是父类的hello方法。

此外,如果存在父方法Parent.hello,那么您可能希望在Child.hello内使用super调用它。但这取决于背景和意图 - 例如如果你想让孩子略微修改父母的现有行为,那么使用super可能是有意义的,但是如果孩子完全重新定义了父类的行为,那么调用父的超级方法可能没有意义,如果结果只是去被丢弃通常情况下,安全方面并调用超类的方法通常会更好,因为它们可能会产生您希望孩子保留的重要副作用。

另外值得一提的是,这适用于python 2和3. Python 3中唯一的区别是python 3中的超级调用更好一些,因为你不需要将父类和self传递给它参数。例如。在py3中它只是super().greet()而不是super(Parent, self).greet()