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.
答案 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()
。