在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类:
1、super(class, self).__init__(a)通过MRO的顺序找到传入class的下一个类来进行初始化。比如super(Child, self).__init__(a),实际上是将a传入Child的下一个类,即Base1。对Base1进行初始化,并保存到self中。super(Base1, self).__init__(b)则是将b传入Base2对其进行初始化。
2、文中注释的代码class.__init__(self, a),通过显式的方式对父类class进行初始化,此时Base1.__init__(self, a)就是将a传入Base1对其进行初始化。这种方式相较于super更容易理解,但需要自行控制好初始化的顺序。此外,这种方式可以无需把父类写在子类的类名括号中,也能实现对父类方法和属性的继承。当然这实际上等于复制了父类的属性和方法,而并没有继承的关系,从而不能利用到继承关系的一些python特性,如isinstance()方法的调用等。
要查看某个类的MRO,可使用class.__mro__。
标签:__,.__,Base1,python,self,继承,init,理解,父类 From: https://www.cnblogs.com/qizhou/p/18089614