一文详解python多继承的3C算法

 更新时间:2024年07月01日 09:26:24   作者:小明同学LukeLiang  
有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法,本文将给大家详细的介绍一下python多继承的3C算法,需要的朋友可以参考下

python多继承的3C算法

有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法

python多继承的深度遍历

class C:
    def run(self):
        print("这个是C类的方法");
    pass;

class A(C):
    # def run(self):
    #     print("这个是A类的方法");
    pass;


class B:
    def run(self):
        print("这个是B类的方法");



class MainC(A,B):
    pass;
    # def run(self):
    #     print("这个是子类的方法");


m1 = MainC();
m1.run();
print(MainC.mro())

这段代码输出的结果就是 这个是C类的方法 [<class 'main.MainC'>, <class 'main.A'>, <class 'main.C'>, <class 'main.B'>, <class 'object'>]

每个类如果没有继承其他类的话就默认继承object这个基类 这个是比较正常的多继承,然后是深度遍历的方式

重复继承的问题

基于上面改造一下

class C:
    def run(self):
        print("这个是C类的方法");
    pass;

class A(C):
    # def run(self):
    #     print("这个是A类的方法");
    pass;


class B(C):
    def run(self):
        print("这个是B类的方法");



class MainC(A,B):
    pass;
    # def run(self):
    #     print("这个是子类的方法");


m1 = MainC();
m1.run();
print(MainC.mro())

这个继承顺序就有意思了,main继承A和B,A继承C,B也继承C,这就出现了重复继承的问题,那这种情况python是如何决定继承顺序的呢 输出结果:

这个是B类的方法
[<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]

这个结果就出乎意料了,因为按照深度遍历的方式的话,也应该继承C再继承B,但是却不是这样的 这个是因为python对于重复继承的处理,按照这个继承方式的话继承顺序是这样的 mianC先继承A,然后到查看C的情况,发现C同时被A和B继承了,然后就先不处理,接着继承B,然后看C的时候发现,没有其他的继承了,就接着继承C

更加复杂的继承

class F:
    def run(self):
        print("这个是F类的方法");
    pass;

class G:
    def run(self):
        print("这个是G类的方法");
    pass;

class E(F,G):
    def run(self):
        print("这个是E类的方法");
    pass;

class C(E):
    def run(self):
        print("这个是C类的方法");
    pass;
class D(E):
    def run(self):
        print("这个是D类的方法");

class A(C):
    # def run(self):
    #     print("这个是A类的方法");
    pass;

class B(D):
    def run(self):
        print("这个是B类的方法");

class MainC(A,B):
    pass;
    # def run(self):
    #     print("这个是子类的方法");


m1 = MainC();
m1.run();
print(MainC.mro())

继承顺序:

[<class '__main__.MainC'>, <class '__main__.A'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.G'>, <class 'object'>]

这个就是跟复杂的多继承了,但是只要用到上面说的逻辑去推理就知道继承顺序了 mainc先继承A,然后看C,没有被重复继承,就继承C,再看E,E被重复继承了,先不处理,再从上面开始看,看B,没有被重复继承,再看D也没有被重复继承,直接继承,再看E,也没有其他的再继承了就可以直接继承,然后再看F,没有重复继承,就继承,再到G

这个就是实际上python多继承顺序的算法,如果单纯说是深度遍历,其实是不对的

注意

尽量不要用多继承,尽量不要用多继承,尽量不要用多继承。 用多继承会让你的程序变得复杂又难读,产生的bug也难查

到此这篇关于一文详解python多继承的3C算法的文章就介绍到这了,更多相关python 3C算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • centos7中安装python3.6.4的教程

    centos7中安装python3.6.4的教程

    Python3.6.4官方版是一款在适合开发人员使用的windows系统上运行的脚本语言工具,Python3.6.4官方版是目前程序设计从业者必学的语言之一。这篇文章给大家介绍了centos7中安装python3.6.4的教程,感兴趣的朋友一起看看吧
    2019-12-12
  • python获取字符串中的email

    python获取字符串中的email

    这篇文章主要介绍了python获取字符串中的email,通过调用re库,通过使用compile、findall获取字符串中的email,下文详细实现过程需要的小伙伴可以参考一下
    2022-03-03
  • python获取本周、上周、本月、上月及本季的时间代码实例

    python获取本周、上周、本月、上月及本季的时间代码实例

    这篇文章主要给大家介绍了关于python获取本周、上周、本月、上月及本季的时间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • python实现Oracle查询分组的方法示例

    python实现Oracle查询分组的方法示例

    这篇文章主要介绍了python实现Oracle查询分组的方法,结合实例形式分析了python使用group by子句及having子句实现Oracle查询分组的相关操作技巧,需要的朋友可以参考下
    2020-04-04
  • C++与Python混合编程实战(附详细示例)

    C++与Python混合编程实战(附详细示例)

    这篇文章主要介绍了C++与Python混合编程的相关资料,通过将 Python 与 C/C++ 混合编程,可以有效提高关键任务的执行效率,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • Python可迭代对象与迭代器的用法及说明

    Python可迭代对象与迭代器的用法及说明

    文章主要介绍了迭代器和可迭代对象的概念、Python中如何判断一个对象是否可迭代、序列为什么可迭代、如何使用iter()函数处理可调用对象、Python中迭代器的接口以及Sentence类的迭代器实现
    2026-04-04
  • Python发送邮件封装实现过程详解

    Python发送邮件封装实现过程详解

    这篇文章主要介绍了Python发送邮件封装实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 利用python爬取斗鱼app中照片方法实例

    利用python爬取斗鱼app中照片方法实例

    最近在学习python,通过实践是学习的一个好办法,下面这篇文章就来给大家介绍了关于利用python爬取斗鱼app中照片的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧。
    2017-12-12
  • Python处理百万级社保数据的性能优化秘籍

    Python处理百万级社保数据的性能优化秘籍

    这篇文章主要为大家详细介绍了Python处理百万级社保数据的性能优化技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-01-01
  • 解决使用PyCharm时无法启动控制台的问题

    解决使用PyCharm时无法启动控制台的问题

    今天小编就为大家分享一篇解决使用PyCharm时无法启动控制台的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论