【问题标题】:Python multiple inheritance super functionPython多重继承超级函数
【发布时间】:2015-10-19 19:11:05
【问题描述】:

我对 python 多重继承有点困惑。

例如,如果您有:

class A(object):
def __init__(self):
    print "init A"
    super(A, self).__init__()

class B(A):
    def __init__(self):
        print "init B"
        super(B, self).__init__()

class C(A):
    def __init__(self):
        print "init C"
        super(C, self).__init__()

class D(C, B):
    def __init__(self):
        print "init D"
        super(D, self).__init__()

if __name__ == '__main__':
    D()

方法解析顺序 (MRO) 为 D-C-B-A。

为什么顺序不是 D-C-A-B-A?

【问题讨论】:

  • 因为你不能在mro中有重复...
  • 确实,Python 继承系统的整个设计就是让您展示的菱形继承方案成为可能。由于最终基类的路径重复,它们往往会在其他语言(如 C++)中做坏事。

标签: python multiple-inheritance


【解决方案1】:

Python 文档:

对于新型类,动态排序是必要的,因为所有多重继承的情况都表现出一种或多种菱形关系(其中至少一个父类可以从最底层的类通过多条路径访问)。例如,所有新式类都继承自 object,因此任何多重继承的情况都提供了多个到达 object 的路径。 为了防止基类被多次访问,动态算法将搜索顺序线性化,以保留每个类中指定的从左到右的顺序,即每个父类只调用一次,那是单调的(意味着一个类可以被子类化而不影响其父类的优先顺序)。总之,这些属性使得设计具有多重继承的可靠和可扩展的类成为可能。详情请见https://www.python.org/download/releases/2.3/mro/。

【讨论】:

    【解决方案2】:

    粗略地说,MRO 是这样给出的

    算法是这样的,对于任何基类,mro 中 its 基类的顺序总是相同的(如果这不可能,我相信你会得到一个错误)。

    如果不删除重复项,则顺序实际上是 D-C-A-object-B-A-object。由于多种原因,这令人困惑。首先,如果方法调用超级,就像你的情况一样,那么同一个方法可以被调用两次。其次,B 的实现期望在方法解析顺序上领先于 A 和对象是合理的。如果它覆盖了 A 的属性,则预计这种覆盖不会被反转。

    【讨论】:

      【解决方案3】:

      MRO 是 D-C-B-A 的原因是,它是 D-C-A-B-A(或 D-C-A-B)会产生奇怪的效果。在这个特定的示例中,A 类构造函数不接受任何参数并且显式地执行仅在菱形继承树中重要的 super() 调用。如果它没有调用super,则不会从A 构造函数中调用B 构造函数。如果构造函数接受参数,那么A 构造函数将被卡在岩石和坚硬的地方之间。如果它不调用super,那么它就不能在钻石继承中工作。如果它确实调用了super,那么由于object.__init__ 不接受任何参数,如果它没有在菱形继承模式中使用,构造函数将会失败。

      【讨论】:

        【解决方案4】:

        您只实例化一个对象。 Python 允许每个祖先的__init__ 在 MRO 中只执行一次。因此,我们不会同时执行 A->C 和 A->B 关系A.__init__

        只有这么多解释,您可能会认为我们会得到 D-C-A-B ...但由于 B 也需要 A.__init__,因此 MRO 有足够的耐心在确定执行顺序之前解析整个图表。

        【讨论】:

          猜你喜欢
          • 2018-04-22
          • 2020-02-29
          • 2016-09-03
          • 2012-07-06
          • 1970-01-01
          • 2016-06-30
          • 1970-01-01
          • 1970-01-01
          • 2014-09-02
          相关资源
          最近更新 更多