前言
多继承势必要解决同名属性冲突。今天测试一下。
正文
左右同名(左侧优先)
当左侧基类和右侧基类中存在同名方法时,不管是否包含重写,都是左侧优先。
今天主要探讨的是,左侧基类中不直接包含同名方法。
约定
我们约定,下面的标题情况全都是在左侧基类不直接包含同名方法的。
为了方便叙述,我们把“曾祖父,祖父,爸爸,儿子”称为一家人,把“叔伯(爸爸的兄弟),堂兄弟之间”称为同一家族的不同分支。
右侧重写
class A:def display(self):print('顶级父类')class B(A):passclass C(A):def display(self):print('一级子类C')class Test(B, C):# 初始化直接调用displaydef __init__(self):self.display()if __name__ == '__main__':t = Test()
可以看出,这时C的重写方法优先
多重继承
class A:def display(self):print('顶级父类')class A2(A):def display(self):print('一级子类A2')class B(A2):passclass C(A):def display(self):print('一级子类C')class Test(B, C):# 初始化直接调用displaydef __init__(self):self.display()if __name__ == '__main__':t = Test()
B的方法优先了,看来继承层级影响优先级,层级越深优先级越高。同一层级左侧优先。
由于左侧 > 右侧,所以只有右侧的继承层级高一级时,能够比左侧的重写更优先。
同一家族的不同分支
简单来说就是祖先一样,爸爸爷爷之类的都可能不同。
这个直接上结论吧,不同分支和不重写的处理方式是一样的,只要左边有,不管多少级父类,都是左边优先。
结论
直接包含
左侧直接包含(不是继承来的)某个方法,不管右侧怎么写的,一定是按左侧的方法来。
左侧不直接包含某方法
不同分支或者没有血缘关系,则左侧一定优先,不管继承层级。
同一分支(一家人)
左侧不直接包含该方法,则优先级按继承层级来分。
右侧高一级时可以优先,其余情况还是左侧优先。
我感觉这样还是相当合理的
总结
当左侧不直接包含某个方法,两个基类(B,C)的父类在族谱又是同一条线上的情况下,继承的层级影响优先级,当右侧的层级更深时(>左侧),则右侧优先,其余情况一概是左侧优先。