【问题标题】:Multiple Inheritance Python with super() [duplicate]带有 super() 的多重继承 Python [重复]
【发布时间】:2018-12-03 14:48:57
【问题描述】:

我有一种情况,我必须初始化所有的基类

class B:
    def __init__(self):
        print("B.__init__")

class C:
    def __init__(self):
        print("C.__init__")

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

class E(D):
    def __init__(self):
        print("E.__init__")
        super().__init__()

x = E()

但是上面的代码导致

E.__init__
D.__init__
B.__init__

我关心的是为什么 C 没有被初始化?

【问题讨论】:

  • 你希望super 调用这两个构造函数吗?
  • 因为B 在方法解析顺序中位于C 之前,但不包含对super 的调用
  • super 比看起来要复杂一些。 Here's a good article 由一位 Python 开发人员讲述其用途。

标签: python multiple-inheritance


【解决方案1】:

当两个子类提供方法时(这里是__init__),Python 只调用该方法一次,并根据方法解析顺序 (MRO) 决定调用哪一个。

您可以通过访问 __mro__ 属性来检查 MRO。

>>> D.__mro__
(__main__.D, __main__.B, __main__.C, object)

当调用方法时,首先要查看的位置是D,然后是B,然后是C,然后是object

【解决方案2】:

因为super() 不会自动调用所有 继承的方法,只会调用层次结构中的下一个方法。为确保全部调用,您应该在BC__init__ 方法中添加super().__init__()(在您的特定场景中,您只需将其添加到B

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 2016-02-25
    • 2021-11-28
    • 2018-12-08
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    相关资源
    最近更新 更多