当前位置: 首页 > news >正文

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也难查

http://www.lryc.cn/news/387458.html

相关文章:

  • 掌握Python编程的深层技能
  • Echarts地图实现:各省市计划录取人数
  • shell脚本if/else使用示例
  • 【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(二)
  • Java中的Monad设计模式及其实现
  • Dahlia Hart: Stylized Casual Character(休闲角色模型)
  • vector容器
  • 二进制常用知识整理<java>
  • 基于Docker的淘客返利平台部署
  • 【涵子来信科技潮流】——WWDC24回顾与暑假更新说明
  • 重温react-08(createContext使用方式)
  • LInux后台运行程序
  • DEBOPIE框架:打造最好的ChatGPT交易机器人
  • C++ Thead多线程 condition_variable 与其使用场景---C++11多线程快速学习
  • 什么是前端开发?
  • 大数据面试题之Spark(1)
  • Spring Boot 和 Spring Framework 的区别是什么?
  • JVM原理(四):JVM垃圾收集算法与分代收集理论
  • 1961 Springboot自习室预约系统idea开发mysql数据库web结构java编程计算机网页源码maven项目
  • 前端面试题(12)答案版
  • SpringMVC 域对象共享数据
  • 每天五分钟深度学习框架pytorch:tensor向量之间常用的运算操作
  • 【数据结构】(C语言):栈
  • c++类成员指针用法
  • [240625] Continue -- 开源 Copilot | Web-Check 网站分析工具 | Story of EOL
  • 【Mac】Auto Mouse Click for Mac(高效、稳定的鼠标连点器软件)软件介绍
  • javaSE知识点整理总结(下)、MySQL数据库
  • Perl入门学习
  • 2024年7月计划(ue5肉鸽视频完成)
  • 恢复策略(上)-撤销事务(UNDO)、重做事务(REDO)