您的位置: 网站首页> python面向对象> 当前文章
多继承广度|深度优先,C3算法,继承顺序__mro__
老董-我爱我家房产SEO2020-08-01172围观,105赞
一个类可能有多个父类,这个就涉及多继承。
每个父类可能还有自己的父类,这一群父类之间可能有同名方法,总而言之,可能会出现非常混乱的继承局面。所以多继承就涉及到继承顺序(即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__文章写得不错,值得赞赏