python多继承的类型定义了同一个属性或者方法
在 Python 中,当一个类通过多继承同时继承多个父类,且这些父类中定义了同名的属性或方法时,Python 会按照方法解析顺序(MRO,Method Resolution Order) 来确定最终使用哪个父类的属性或方法。
1 方法解析顺序(MRO)
MRO 是 Python 解决多继承冲突的核心规则,它定义了类在查找属性或方法时的顺序。可以通过类的 mro 属性或 mro() 方法查看具体顺序。
Python 3 中,MRO 采用 C3 线性化算法,遵循以下原则:
子类优先于父类。
多个父类按继承时的声明顺序查找。
保证父类的 MRO 顺序不变。
2. 同名属性 / 方法的覆盖规则
当多继承的父类存在同名属性或方法时,解释器会按 MRO 顺序依次查找,找到第一个匹配的属性或方法后就停止查找。
3. 示例说明
示例 1:同名方法的冲突
class A:def show(self):print("A 的 show 方法")class B:def show(self):print("B 的 show 方法")
多继承:C 同时继承 A 和 B
class C(A, B): # 继承顺序为 A -> Bpassc = C()
c.show() # 输出:A 的 show 方法(按 MRO 先找到 A 的 show)
查看 C 的 MRO
print(C.mro())
输出:[<class ‘main.C’>, <class ‘main.A’>, <class ‘main.B’>, <class ‘object’>]
由于 C 继承顺序是 A, B,MRO 中 A 在 B 之前,因此 c.show() 调用的是 A 的方法。
示例 2:同名属性的冲突
class X:name = "X"class Y:name = "Y"class Z(X, Y): # 继承顺序 X -> Ypassz = Z()
print(z.name) # 输出:X(按 MRO 先找到 X 的 name)
示例 3:子类重写同名方法
如果子类自己定义了同名属性或方法,则会覆盖所有父类的定义(符合 “子类优先于父类” 原则):
class A:def show(self):print("A 的 show")class B:def show(self):print("B 的 show")class C(A, B):def show(self): # 子类自己的方法print("C 的 show")c = C()
c.show() # 输出:C 的 show(子类优先)
- 如何主动调用父类的同名方法?
如果需要在子类中主动调用某个父类的同名方法,可以使用 super() 或直接通过父类名调用:
class A:def show(self):print("A 的 show")class B:def show(self):print("B 的 show")class C(A, B):def show(self):super().show() # 按 MRO 调用下一个类的 show(这里是 A)B.show(self) # 直接指定调用 B 的 showc = C()
c.show()
输出:
A 的 show
B 的 show
总结
多继承中同名属性 / 方法的选择由 MRO 决定,遵循 “先子类后父类,按继承声明顺序查找” 的规则。实际开发中应尽量避免复杂的多继承,如需使用,可通过 mro 明确查找顺序,或用 super() 主动控制调用逻辑。
