当前位置: 代码网 > it编程>前端脚本>Python > Python类的多继承的搜索顺序

Python类的多继承的搜索顺序

2024年05月18日 Python 我要评论
python支持多继承,而任何实现多继承的语言都需要处理潜在的命名冲突,这种命名冲突是由不相关的祖先类实现同名方法引起,这种冲突就被称为 菱形问题。需要声明的是,在python3中多继承的搜索顺序为:

python支持多继承,而任何实现多继承的语言都需要处理潜在的命名冲突,这种命名冲突是由不相关的祖先类实现同名方法引起,这种冲突就被称为 菱形问题。

 需要声明的是,在 python3 中多继承的搜索顺序为:从左至右,广度优先;python2采用的多继承搜索顺序为:从左至右,深度优先。

一、首先,先来看一下菱形问题

它的继承关系、代码实现和运行结果如下图所示:

class a:
    def show(self):
        print('---a---')


class b(a):
    def fun(self):
        print('this is class b!')


class c(a):
    def fun(self):
        print('this is class c!')


class d(b, c):
    def show(self):
        super().show()   #--->1
        print('---d---')    

    def test(self):
        self.show()   #--->2
        super().show()   #--->3
        self.fun()  #--->4
        super().fun()   #--->5
        c.fun(self)   #---->6
        c.show(self)    #--->7


d = d()
d.show()
print('-----------------------------')
d.test()

  首先,创建d类的对象的d,然后调用其中的 show 方法,再调用 test 方法(以下序号在代码中标出):

1、调用 show 方法,由于类 d 实现了自己的 show 方法,则此时进入 d 类的 show 方法,然后使用 super 方法调用了父类的 show方法,b、c类都没有实现该方法,则继续往上找,a 类中实现了 show 方法,则执行该方法,再继续向下执行。

2、在 test 方法中首先调用了自己的 show 方法,则重复上一条的执行顺序。

3、此处调用父类的 show 方法,往上找a类中实现了 show 方法,则执行该方法。

4、由于d类没有 fun 方法,则根据搜索顺序,b--->a,则执行b类的 fun 方法。

5、调用父类的 fun 方法,搜索顺序与上一条相同。

6、此处需要注意,直接在类上调用实例方法时,必须显示的传入参数 self。

二、再来看一个例子,其继承关系、代码实现和运行结果如下图所示:

class a:
    pass


class b:
    pass


class c(a):
    pass


class d(a):
    pass


class e(b, c):
    pass


class g1(c, b, d):
    pass


class f1(d, b):
    pass


class f2(c, d):
    pass


class g2(c, d, b):
    pass


class g3(d, b, c):
    pass


print(c.__mro__)
print(d.__mro__)
print(e.__mro__)
print(f1.__mro__)
print(f2.__mro__)
print(g1.__mro__)
print(g2.__mro__)
print(g3.__mro__)

在这里,首先需要介绍一个类的属性 __mro__ ,它的返回值是一个元组,可按照方法解析顺序(由于python会按照特定的顺序遍历继承图,这个顺序成为方法解析顺序)列出各个超类,从当前类一直向上,知道 object 类。为了更加深入的说明问题,在代码实现时,增加了几个不同的继承关系。从以上代码中,可以得出以下结论:

1、类的多继承与继承的顺序有关,按照从左到右的顺序,依次搜索。

2、继承采用从左到右,广度优先顺序进行搜索,例如类 f2。

3、同一级别的父类搜索完之后,才继续向上一级搜索,例如类 g1、g2、g3。

4、所有的继承搜索顺序到达 object 类停止。

到此这篇关于python类的多继承的搜索顺序的文章就介绍到这了,更多相关python类多继承顺序内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com