在下面的示例中,B.Go()
方法中的最后两行都从Go()
调用class A
方法。它们功能相同吗?使用super()
的唯一好处是我不必知道继承的类名吗?
class A(object):
def Go(self):
print "Calling A.Go()"
class B(A):
def Go(self):
super(B, self).Go()
A.Go(self)
inst = B()
inst.Go()
答案 0 :(得分:14)
不,super()
执行直接调用A.Go
无法的内容。 super(B, self).Go()
调用方法解析顺序中的下一个方法。它调用了被称为的方法,B
根本没有实现该方法。在直接线性继承中,这总是A
,所以没有真正的区别(除了你重复的类。)然而,在多重继承的情况下,正常方法解析顺序中的下一个类不一定是直接的当前类的基类。请参阅Guido's original explanation这些功能中的钻石继承说明。
答案 1 :(得分:4)
除了Thomas Wouters提供的优秀答案之外,我还要补充说super()
非常有用,因为它是一个计算间接。使用super()
的一个关键好处是,您不必按名称指定委托类,这样可以在以后更改基类。雷蒙德·海廷格(Raymond Hettinger)就此发表了一篇很好的文章:Python's super() considered super!
答案 2 :(得分:2)
不完全是。通过使用super,您只需要实例化B,就有一个实例。第二行创建A的新实例,可能在初始化程序中有副作用,并且不共享其他实例属性或状态(B实例inst
)。
答案 3 :(得分:1)
他们完全不同。调用A()。Go()构造一个全新的对象,它不与创建它的实例共享任何属性。
你的例子太简单了,你需要有一个状态来显示真正不同的行为