使用多继承,我们可以使一个子类对象同时拥有多个父类的特性。但是如果在不同的父类中存在同名的方法,我们在使用子类对象调用方法的时候,到底调用的是哪一个父类中的方法呢?
所以这就存在了一个多继承重名的问题,因此我们在开发时,应该尽量避免出现这种容易混淆的情况。
多继承重名问题
在多继承中,如果在不同的父类中存在同名的方法,
注意:如果父类之间存在同名的属性或方法,应尽量避免使用多继承。这样很难直观的判断出这个方法是调用哪一个类中的,影响代码的阅读。
方法搜索顺序MRO(method resolution order)
method resolution order 简称 MRO (方法搜索顺序),就是我们让某一个对象调用某一个方法时,Python 解释器是按照什么样的顺序在创建这个对象的类以及它的父类之间搜索这个方法的。主要用于在多继承时 判断方法或属性的调用路径。在多继承中,新式类和经典类的 MRO 可能会有所不同。
在 Python 中,利用类的内置属性
__mro__ 是类的内置属性,通过
class A:
pass
class B:
pass
class C(A, B): # C 类有两个父类A和B,所以C同时具有A类和B类的属性和方法
pass
print(C.__mro__)
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()
当 C 类的实例对象调用 getAge() 方法和 getName() 方法时,Python 解释器会现在当前这个类 C 中查找这两个方法,如果找到了,则直接执行这个方法,如果没有找到,才会继续往后在 A 类中查找,以此类推,直到找到为止。
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
暂无评论内容