您的位置: 网站首页> python面向对象> 当前文章

多继承广度|深度优先,C3算法,继承顺序__mro__

老董-我爱我家房产SEO2020-08-01154围观,130赞

  一个类可能有多个父类,这个就涉及多继承。

  每个父类可能还有自己的父类,这一群父类之间可能有同名方法,总而言之,可能会出现非常混乱的继承局面。所以多继承就涉及到继承顺序(即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。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    多继承广度|深度优先,C3算法,继承顺序__mro__文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 客服微信:a772483200