Python类的多继承的搜索顺序

 更新时间:2024年03月31日 10:58:51   作者:琛cc  
python和C++一样,支持多继承,本文主要介绍了Python类的多继承的搜索顺序,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

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类多继承顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pandas中提取DataFrame某些列的一些方法

    pandas中提取DataFrame某些列的一些方法

    dataframe是pandas包的重要对象,熟练掌握dataframe的基本操作是很有必要的,下面这篇文章主要给大家介绍了关于pandas中提取DataFrame某些列的一些方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Python使用pylab库实现绘制直方图功能示例

    Python使用pylab库实现绘制直方图功能示例

    这篇文章主要介绍了Python使用pylab库实现绘制直方图功能,结合实例形式分析了Python数据读取、遍历以及基于pylab库绘制直方图的相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • Django查询优化及ajax编码格式原理解析

    Django查询优化及ajax编码格式原理解析

    这篇文章主要介绍了Django查询优化及ajax编码格式原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python调用golang代码详解

    Python调用golang代码详解

    这篇文章主要给大家介绍了关于Python调用golang代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • python3实现raspberry pi(树莓派)4驱小车控制程序

    python3实现raspberry pi(树莓派)4驱小车控制程序

    这篇文章主要为大家详细介绍了python3实现raspberry pi(树莓派)4驱小车控制程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Python使用Kafka处理数据的方法详解

    Python使用Kafka处理数据的方法详解

    Kafka是一个分布式的流数据平台,它可以快速地处理大量的实时数据。在Python中使用Kafka可以帮助我们更好地处理大量的数据,本文就来和大家详细讲讲具体使用方法吧
    2023-04-04
  • Python中列表和字符串常用的数据去重方法总结

    Python中列表和字符串常用的数据去重方法总结

    关于数据去重,咱们这里简单理解下,就是删除掉重复的数据,应用的场景比如某些产品产生的大数据,有很多重复的数据,为了不影响分析结果,我们可能需要对这些数据进行去重,所以本文给大家总结了Python中列表和字符串常用的数据去重方法,需要的朋友可以参考下
    2023-11-11
  • python使用xlsxwriter实现有向无环图到Excel的转换

    python使用xlsxwriter实现有向无环图到Excel的转换

    这篇文章主要为大家详细介绍了python使用xlsxwriter实现有向无环图到Excel的转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 基于python的selenium两种文件上传操作实现详解

    基于python的selenium两种文件上传操作实现详解

    这篇文章主要介绍了基于python的selenium两种文件上传操作实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python Pandas:DataFrame一列切分成多列、分隔符切分选字段方式

    Python Pandas:DataFrame一列切分成多列、分隔符切分选字段方式

    这篇文章主要介绍了Python Pandas:DataFrame一列切分成多列、分隔符切分选字段方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论