【问题标题】:Python's super() functionPython super() 函数
【发布时间】:2011-09-15 03:24:59
【问题描述】:

在下面的示例中,B.Go() 方法中的最后两行都从class A 调用了Go() 方法。它们在功能上是否相同?使用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()

【问题讨论】:

  • 你可能指的是A.Go(self)而不是A().Go()
  • @Thomas - 已更新,谢谢。

标签: python oop inheritance


【解决方案1】:

除了Thomas Wouters 提供的出色答案之外,我还要补充一点,super() 也非常有用,因为它是计算间接。使用super() 的一个关键好处是您不必按名称指定委托类,这使得以后更改基类变得容易。 Raymond Hettinger 对此有一篇很棒的帖子:Python's super() considered super!

【讨论】:

    【解决方案2】:

    不,super() 做了一些直接调用 A.Go 的事情不能super(B, self).Go() 调用方法解析顺序中的下一个方法。它调用了 将被调用的方法,而 B 根本没有实现该方法。在直接线性继承中,这始终是A,因此没有真正的区别(除了您重复的类。)然而,在多重继承的情况下,正常方法解析顺序中的下一个类不一定是直接基类当前班级。请参阅这些功能的Guido's original explanation 中对菱形继承的解释。

    【讨论】:

      【解决方案3】:

      它们完全不同。调用 A().Go() 构建一个全新的对象,该对象不与创建它的实例共享任何属性。

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

      【讨论】:

        【解决方案4】:

        不完全是。通过使用 super 你只需要实例化 B,就有一个实例。第二行创建了一个 A 的新实例,可能在初始化程序中有副作用,并且不共享其他实例属性或状态(B 实例 inst)。

        【讨论】:

        • 这不是真的。 A().Go() 会按照您的描述进行。 A.Go(self) 正在获取类 A 上的 Go 方法,但未绑定到实例,然后将 self(在本例中为 B 的实例)作为实例参数传递给该方法。
        • 啊,对不起,我才发现原来的描述被编辑了。
        猜你喜欢
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 2013-02-18
        • 1970-01-01
        • 2014-05-23
        • 2022-06-11
        相关资源
        最近更新 更多