【问题标题】:Method order resolving in multiple and multilevel inheritance in python while calling the constructor调用构造函数时在python中解析多级和多级继承的方法顺序
【发布时间】:2019-01-15 05:23:04
【问题描述】:

注意事项:

  1. 在打印 D 类的 MRO 时获取正确的继承顺序,但无法获取 C 类的构造函数调用。

问题:为什么不在下面给定代码中的 A 构造函数 之后打印 C 构造函数?:

class A(object):

    def __init__(self):
        print("A Constructor")

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

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

   def method(self):
        print("C method")  


class D(B, C):
    def __init__(self):
        print("D Constructor")
        super(D, self).__init__()
        super().method()
d = D()
print(D.__mro__)

输出:

【问题讨论】:

  • 我无法解释,所以我不发布答案,但解决它的方法是更改​​:class D(B,C):class D(C,B):
  • @U9-Forward:是的,能够在从 D(B, C) 类更改为 D(C, B) 类时打印所有需要的值。但我想知道为什么上面的代码没有给出预期的答案。
  • 是的,这就是我没有回答的原因
  • @blhsing 在打印 D.__mro__ 时获得正确的顺序,但没有获得 C 类的构造函数调用

标签: python class oop constructor multiple-inheritance


【解决方案1】:

1 C 的 init 从未被称为 cos

2 super 开始搜索 D 到 D->B->A-> 并结束 -> object

3 在这种情况下,搜索从 D->B->A->object 开始,第一个 super 完成。

对象或类型确定要搜索的方法解析顺序。搜索从类型之后的类开始。

如果object-or-type的mro是D -> B -> C -> A -> object并且type的值是B,那么super()搜索C -> A - > 对象

4 然后第二个 super() 使您可以从继承自超类的子类访问超类中的方法。

5 在这种情况下,您可以访问 C.method 并在打印第一个 super 的构造函数后打印“C 方法”。

super() 单独返回超类的临时对象,然后允许您调用该超类的方法 允许您以最少的代码更改换出超类。

【讨论】:

    【解决方案2】:

    如果你想知道 MRO 在 Python 中是如何工作的,我建议你看看这个link

    在 Python 2.3 及更高版本中,Python 对 MRO 使用 C3 线性化算法。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多