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

问题描述 投票:5回答:1

注:

  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

注意:在打印类D的MRO时获得正确的继承顺序,但没有得到类C的构造函数调用。问题:为什么不在...]中的A构造函数之后打印C构造函数? [

1 C的
init
从未被称为cos
2个超级开始在D上搜索到D-> B-> A->并在->对象上结束

3在这种情况下,搜索从D-> B-> A->对象开始,并且第一个超级对象完成。对象或类型确定要搜索的方法解析顺序。搜索从类型后面的类开始。

如果对象或类型的

mro

是D-> B-> C-> A->对象并且类型的值为B,则super()搜索C-> A->对象

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

5在这种情况下,您可以访问C.method并在打印第一个超级类的构造函数后打印“ C方法”。super()单独返回超类的一个临时对象,然后您可以调用该超类的方法允许您以最少的代码更改换出超类。

python class oop constructor multiple-inheritance
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.