Python多继承方法重名问题及MRO(方法搜索顺序)

使用多继承,我们可以使一个子类对象同时拥有多个父类的特性。但是如果在不同的父类中存在同名的方法,我们在使用子类对象调用方法的时候,到底调用的是哪一个父类中的方法呢?

所以这就存在了一个多继承重名的问题,因此我们在开发时,应该尽量避免出现这种容易混淆的情况。

多继承重名问题

在多继承中,如果在不同的父类中存在同名的方法,子类调用方法时是根据 MRO 来确定这个方法是调用哪一个类的

注意:如果父类之间存在同名的属性或方法,应尽量避免使用多继承。这样很难直观的判断出这个方法是调用哪一个类中的,影响代码的阅读。

方法搜索顺序MRO(method resolution order)

method resolution order 简称 MRO (方法搜索顺序),就是我们让某一个对象调用某一个方法时,Python 解释器是按照什么样的顺序在创建这个对象的类以及它的父类之间搜索这个方法的。主要用于在多继承时 判断方法或属性的调用路径。在多继承中,新式类和经典类的 MRO 可能会有所不同。

在 Python 中,利用类的内置属性 __mro__ 可以查看方法搜索顺序。当我们用对象调用某一个方法时,Python 解释器会按照 __mro__ 输出的顺序来确定到底应该执行哪个类里面的方法。

__mro__ 是类的内置属性,通过 类名.__mro__ 来调用:

class A:
    pass
class B:
    pass
class C(A, B):  # C 类有两个父类A和B,所以C同时具有A类和B类的属性和方法
    pass
print(C.__mro__)
图片[1]-Python多继承方法重名问题及MRO(方法搜索顺序)-尤尤'blog

1)在搜索方法时,按照 __mro__ 输出的结果从左往右顺序查找;

2)如果在当前类中找到方法,就不再搜索,直接执行;

3)如果没找到,就查找下一个类,如此类推,直到找到为止;

4)如果在最后一个类中还没有找到,就会程序报错。

class A:
    def getName(self):
        print('A:getName方法')

    def getAge(self):
        print('A:getAge方法')


class B:
    def getName(self):
        print('B:getName方法')

    def getAge(self):
        print('B:getAge方法')


class C(A, B):  # C 类有两个父类A和B,所有C同时具有A和B的属性和方法
    pass


c = C()

print(C.__mro__)
c.getAge()
c.getName()
图片[2]-Python多继承方法重名问题及MRO(方法搜索顺序)-尤尤'blog

当 C 类的实例对象调用 getAge() 方法和 getName() 方法时,Python 解释器会现在当前这个类 C 中查找这两个方法,如果找到了,则直接执行这个方法,如果没有找到,才会继续往后在 A 类中查找,以此类推,直到找到为止。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容