在python历史版本中的演变史

python2.2之前:

MRO原则:

  只有经典类,遵循深度优先(从左到右)原则,

  存在的问题:在有重叠的多继承中,违背重写可用原则

  解决办法是再设计类的时候不要设计这样有问题的类

python2.2版本:

MRO原则:

  经典类:遵循深度优先(从左到右)原则

  引入新式类:在深度优先(从左到右)的算法基础之上, 优化了一部分,如果产生重复元素, 会保留最后一个,并且, 更尊重基类出现的先后顺序

    新式类存在的问题:无法检测出有问题的继承,

             有可能还会违背局部优先的原则

            例如:

              

 

python2.3-2.7版本:

MRO原则:

  经典类:遵循深度优先(从左到右)原则

  新式类:C3算法

python3.x之后:MRO原则:

  只有新式类:C3算法

C3算法详解:

公式:

  L(object) = [ object ]

  L(子类(父类1,父类2)) =  [ 子类 ] + merge(L(父类1) + L(父类2) + [父类1,父类2])

  注意:+ 代表合并列表

  mergel算法:

    1、第一个列表中的第一个元素如果是后面列表中的首个元素或者在后面列表中不存在,则将这个元素合并到merge函数前面的最终列表中,并删除这个元素

    2、如果第一个列表第一个元素不成立,则查看第二个列表首个元素,执行第1步操作

    3、如果最终无法把所有元素都归到最终的解析列表中,则报错,说明是错误的继承关系

案列代码:

 class D(object):
# pass # L(D(object)) = [D] + merge(L(object), [object])
# = [D] + merge([object], [object])
# = [D, object] + merge([], [])
# = [D, object] # class B(D):
# pass # L(B(D)) = [B] + merge(L(D), [D])
# = [B] + merge([D, object], [D])
# = [B, D] + merge([object], [])
# = [B, D, object] + merge([], [])
# = [B, D, object] # class C(D):
# pass
# L(C(D)) = [C, D, object] # class A(B, C):
# pass
# L(A) = [A] + merge(L(B), L(C), [B, C])
# = [A] + merge([B, D, object], [C, D, object], [B, C])
# = [A, B] + merge([D, object], [C, D, object], [C])
# = [A, B, C] + merge([D, object], [D, object])
# = [A, B, C, D] + merge([object], [object])
# = [A, B, C, D, object] + merge([], [])
# = [A, B, C, D, object]

查看继承顺序的方法

1、import inspect

  print(inspect.getmro(类))

2、类.mro()

  类.__mro__()

    

  

python多继承下的查找顺序-MRO原则演变与C3算法的更多相关文章

  1. sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO

    sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...

  2. day 24 面向对象之继承及属性查找顺序

    组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def init(self, name, age): self.name = name self.age = age t1 ...

  3. 【Windows下DLL查找顺序 】

    一.写作初衷 在Windows下单个DLL可能存在多个不同的版本,若不特别指定DLL的绝对路径或使用其他手段指定,在应用程序加载DLL时可能会查找到错误的版本,进而引出各种莫名其妙的问题.本文主要考虑 ...

  4. super之mro列表牵引出c3算法

    目录 一:super的使用 二:super之mro列表牵引出c3算法 三:mro列表总结使用 一:super的使用 class Person(object): def __init__(self, n ...

  5. python面向编程:类继承、继承案例、单继承下属性查找、super方法

    一.类的继承 二.基于继承解决类与类的代码冗余问题 三.在单继承背景下属性的查找 四.super的方法 一.类的继承 1.什么是继承? 在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生 ...

  6. 类和实例属性的查找顺序 mro查找

    如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用 mro方法 例如: class A: pass class C(D): pass class B(D): pass class A(B, ...

  7. Windows下DLL查找顺序

    目录 第1章说明    2 1.1 查找顺序    2 1.1.1 检查DllCharacteristics字段    3 1.1.2 读取manifset资源    3 1.1.3 读取manifs ...

  8. 【实测】Python 和 C++ 下字符串查找的速度对比

    完整格式链接:https://blog.imakiseki.cf/2022/03/07/techdev/python-cpp-string-find-perf-test/ 背景 最近在备战一场算法竞赛 ...

  9. Python实现Linux下文件查找

    import os, sys def search(curpath, s): L = os.listdir(curpath) #列出当前目录下所有文件 for subpath in L: #遍历当前目 ...

随机推荐

  1. JS创建类和对象,看完了,头就不大了

    JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...

  2. Jetson TX2 不同的工作模式

    Jetson TX2 有五种工作模式,下面介绍这几种工作模式下电压.频率以及如何启动. 原理图 几种不同的工作模式 mode mode name Denver Frequency ARM Freque ...

  3. 使用canal通过mysql复制协议从binlog实现热数据nosql缓存(2)

    开启mysql binlog功能 以5.7版本为例,找到/etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] pid-file = /var/run/mysqld/m ...

  4. Android开发环境搭建(eclipse版)

    1.下载安装JDK 网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

  5. fastclick.js

    <script src="//cdn.bootcss.com/fastclick/1.0.6/fastclick.js"></script> //<s ...

  6. Facebook推荐算法模型DLRM解读

    参考:https://mp.weixin.qq.com/s/mUNjLuOG2UvztCEP3wyPPw 代码:https://github.com/facebookresearch/dlrm

  7. 二叉查找树 & B(B-)树 & B+树 & B*树

    一 二叉查找树 1 特点 (1)所有非叶子结点至多拥有两个子节点, left和right (2)一个结点存储一个关键字 (3)非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树 2 ...

  8. Netty源码剖析-启动服务

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! --1主线分两步: 一:首先在our thread里,如果写在mai ...

  9. 基于NIO写的阻塞式和非阻塞式的客户端服务端

    由于功能太过简单,就不过多阐述了,直接上阻塞式代码: package com.lql.nio; import org.junit.Test; import java.io.IOException; i ...

  10. python中int是什么类型

    python中的基本数据类型 1:虽然python中的变量不需要声明,但使用时必须赋值整形变量浮点型变量字符型2:可以一个给多个变量赋值,也可以多个给多个变量赋值3:python3中有6个标准数据类型 ...