调用构造函数时在python中实现多级和多级继承的方法顺序解析

时间:2018-08-08 03:41:19

标签: python class oop constructor multiple-inheritance

注释:

  1. 在打印类D的MRO时获得正确的继承顺序,但没有得到类C的构造函数调用。

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

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__)

输出: enter image description here

2 个答案:

答案 0 :(得分:0)

1 C的 init 从未被称为cos

2超级开始在D上搜索D-> B-> A->,然后在->对象上结束

3在这种情况下,搜索从D-> B-> A->对象开始,并且第一个超级对象完成。

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

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

4然后第二个super()允许您从继承自父类的子类中访问父类中的方法。

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

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

答案 1 :(得分:0)

如果您想了解 MRO 在 Python 中的工作原理,我建议您查看此link

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

祝你好运。