LOADING . . .

python中的多继承理解

  在python的多继承中,父类的初始化顺序遵循所谓方法解析顺序(Method Resolution Order,MRO)的机制。python使用C3线性化算法来确定多继承类的MRO:

  1. 目标:创建一个一致的线性继承顺序,同时保持父类的相对顺序和子类优先原则。

  2. 子类优先:子类总是在其父类之前出现。从而子类可以重写父类的方法或属性。

  3. 从左到右的顺序:在多继承类时,指定的父类顺序决定了它们在 MRO 中的优先级,会首先查找靠左的父类中的方法或属性。

  4. 每个类只处理一次:确保在复杂的继承体系中,每个类的方法或属性只被考虑一次。

  关于如下代码:

class Base1:
    def __init__(self, a):
        self.a = a
        print("Base1 initialized", a)

class Base2:
    def __init__(self, a):
        self.a = a
        print("Base2 initialized", a)

class Child(Base1, Base2):
    def __init__(self, a=1, b=2):
        super(Child, self).__init__(a)
        super(Base1, self).__init__(b)
        # Base1.__init__(self, a)
        # Base2.__init__(self, b)

c = Child()

  其中Child类多继承了Base1和Base2,而Base2和Base2都需要传入一个参数。代码中列举了两种方式来初始化Child类:

  super:super(class, self).__init__(a)通过MRO的顺序找到class在MRO中的下一个类来进行初始化。比如以上代码中的super(Child, self).__init__(a),实际上是对Base1进行初始化,并保存到self中。super().__init__(a)与super(Child, self).__init__(a)效果相同。由于其中Base2是Base1在MRO中的下一个类,因此super(Base1, self).__init__(b)是将b传入Base2对其进行初始化,并加载到self中。

  显式初始化:文中注释的代码class.__init__(self, a),通过显式的方式对父类class进行初始化,此时Base1.__init__(self, a)就是将a传入Base1对其进行初始化。这种方式相较于super更容易理解,但需要自行控制好初始化的顺序。此外,这种方式可以无需把父类写在子类的类名括号中,也能实现对父类方法和属性的继承。当然这实际上等于复制了父类的属性和方法,而并没有继承的关系,从而不能利用到继承关系的一些python特性,如isinstance()方法的调用等。

  要查看某个类的MRO,可使用class.__mro__。

posted @ 2024-03-22 15:44  颀周  阅读(35)  评论(0编辑  收藏  举报
很高兴能帮到你~
点赞