Python继承:调用父方法

Python继承:调用父方法,python,python-2.7,inheritance,Python,Python 2.7,Inheritance,在Python2中,有两种方法可以调用从父类继承的方法。使用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):

在Python2中,有两种方法可以调用从父类继承的方法。使用
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
进行调用,但如果没有super,调用会更加简洁


这个问题只针对Python 2。

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

通常,您应该只使用
super
调用与您所在的重写方法同名的父类方法

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

另外,如果有一个父方法
parent.hello
,那么您可能希望使用super从
Child.hello
中调用它。但这取决于上下文和意图——例如,如果您希望孩子稍微修改父类的现有行为,那么使用super可能有意义,但如果孩子完全重新定义父类行为,那么调用父类的super方法可能没有意义,如果结果将被丢弃。通常来说,出于安全考虑,调用超类的方法会更好,因为它们可能有重要的副作用,您希望孩子们保留这些副作用


同样值得一提的是,这适用于Python2和Python3。Python3中唯一的区别是,在Python3中超级调用稍微好一点,因为您不需要将父类和self作为参数传递给它。例如,在py3中,它只是
super().greet()
而不是
super(Parent,self)。greet()

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

通常,您应该只使用
super
调用与您所在的重写方法同名的父类方法

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

另外,如果有一个父方法
parent.hello
,那么您可能希望使用super从
Child.hello
中调用它。但这取决于上下文和意图——例如,如果您希望孩子稍微修改父类的现有行为,那么使用super可能有意义,但如果孩子完全重新定义父类行为,那么调用父类的super方法可能没有意义,如果结果将被丢弃。通常来说,出于安全考虑,调用超类的方法会更好,因为它们可能有重要的副作用,您希望孩子们保留这些副作用

同样值得一提的是,这适用于Python2和Python3。Python3中唯一的区别是,在Python3中超级调用稍微好一点,因为您不需要将父类和self作为参数传递给它。例如,在py3中,它只是
super().greet()
而不是
super(Parent,self).greet()