Python super()函数

时间:2011-06-14 23:51:59

标签: python oop inheritance

在下面的示例中,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()

4 个答案:

答案 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()构造一个全新的对象,它不与创建它的实例共享任何属性。

你的例子太简单了,你需要有一个状态来显示真正不同的行为