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