您的位置: 网站首页> python面向对象> 当前文章
多继承广度|深度优先,C3算法,继承顺序__mro__
老董-我爱我家房产SEO2020-08-01188围观,123赞
一个类可能有多个父类,这个就涉及多继承。
每个父类可能还有自己的父类,这一群父类之间可能有同名方法,总而言之,可能会出现非常混乱的继承局面。所以多继承就涉及到继承顺序(即MRO顺序:method resolution order)问题。(PS:多继承容易让代码逻辑复杂、思路混乱,难以维护,一些语言如Java、C#、PHP 等已经取消了多继承。在实际开发中正常的人类也不会刻意去写多继承。)
python3中多继承并不是严格按照广度优先(按照参数从左到右)或者深度优先(先把左边参数从下到上查找完)这种单一的方式去查找,而是有一个多继承的C3算法存在。
1)看一个深度优先的案例
测试了很多次,这种简单的多继承,c3算出来的结果跟深度优先效果一样。
# -*- coding:utf-8 -*-
class SheDiao:
def say(self):
print('射雕英雄...')
class ShenDiao(SheDiao):
pass
class SanGuo:
def sqy(self):
print('阉人张飞在此')
class YiTan(SheDiao):
def say(self):
print('倚天屠龙')
class XiYou:
def say(self):
print('孙行者...')
class Person1(ShenDiao,SanGuo):
pass
class Person2(YiTan,XiYou):
def say(self):
print('超级人2')
class Man(Person1,Person2):
pass
if __name__ == "__main__":
f1 = Man()
f1.say()
print(Man.__mro__)
超级人2 (<class '__main__.Man'>, <class '__main__.Person1'>, <class '__main__.ShenDiao'>, <class '__main__.Person2'>, <class '__main__.YiTan'>, <class '__main__.SheDiao'>, <class '__main__.SanGuo'>, <class '__main__.XiYou'>, <class 'object'>)
2)看一个广度优先的案例
不好意思,我暂时没有测试出来案例。
3)看1个看不出顺序的案例,C3算法的体会
要获得继承顺序,可以用用内置属性__mro__,其实MRO顺序是一个有序列表,在类被创建时就计算出来了。
# -*- coding:utf-8 -*-
class SheDiao():
def say(self):
print('射雕大侠...')
class ShenDiao(SheDiao):
def skill(self):
print(f'{self.name}技能黯然销魂掌')
class ShuiHu():
def skill(self):
print(f'{self.name}技能回马枪..')
def say(self):
print('打虎好汉在此...')
class SuperMan(ShenDiao,ShuiHu):
def __init__(self, name):
self.name = name
if __name__ == "__main__":
p = SuperMan('老董')
p.skill()
p.say()
print(SuperMan.__mro__)
老董技能黯然销魂掌 射雕大侠... (<class '__main__.SuperMan'>, <class '__main__.ShenDiao'>, <class '__main__.SheDiao'>, <class '__main__.ShuiHu'>, <class 'object'>)
很赞哦!
python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群
相关文章
文章评论
-
多继承广度|深度优先,C3算法,继承顺序__mro__文章写得不错,值得赞赏


