python的多继承中的方法重写

前言

多继承势必要解决同名属性冲突。今天测试一下。

正文

左右同名(左侧优先)

当左侧基类和右侧基类中存在同名方法时,不管是否包含重写,都是左侧优先。

今天主要探讨的是,左侧基类中不直接包含同名方法。

约定

我们约定,下面的标题情况全都是在左侧基类不直接包含同名方法的。

为了方便叙述,我们把“曾祖父,祖父,爸爸,儿子”称为一家人,把“叔伯(爸爸的兄弟),堂兄弟之间”称为同一家族的不同分支。

右侧重写

class A:
    def display(self):
        print('顶级父类')


class B(A):
    pass


class C(A):
    def display(self):
        print('一级子类C')


class Test(B, C):
    # 初始化直接调用display
    def __init__(self):
        self.display()


if __name__ == '__main__':
    t = Test()

可以看出,这时C的重写方法优先
image

多重继承

class A:
    def display(self):
        print('顶级父类')

class A2(A):
    def display(self):
        print('一级子类A2')

class B(A2):

    pass


class C(A):
    def display(self):
        print('一级子类C')


class Test(B, C):
    # 初始化直接调用display
    def __init__(self):
        self.display()


if __name__ == '__main__':
    t = Test()

B的方法优先了,看来继承层级影响优先级,层级越深优先级越高。同一层级左侧优先。
image

由于左侧 > 右侧,所以只有右侧的继承层级高一级时,能够比左侧的重写更优先。

同一家族的不同分支

简单来说就是祖先一样,爸爸爷爷之类的都可能不同。
这个直接上结论吧,不同分支和不重写的处理方式是一样的,只要左边有,不管多少级父类,都是左边优先。

结论

直接包含

左侧直接包含(不是继承来的)某个方法,不管右侧怎么写的,一定是按左侧的方法来。

左侧不直接包含某方法

不同分支或者没有血缘关系,则左侧一定优先,不管继承层级。

同一分支(一家人)

左侧不直接包含该方法,则优先级按继承层级来分。

右侧高一级时可以优先,其余情况还是左侧优先。

我感觉这样还是相当合理的

总结

当左侧不直接包含某个方法,两个基类(B,C)的父类在族谱又是同一条线上的情况下,继承的层级影响优先级,当右侧的层级更深时(>左侧),则右侧优先,其余情况一概是左侧优先。

posted @ 2024-05-10 14:56  魂祈梦  阅读(56)  评论(0)    收藏  举报