python的MRO算法

历史

python2.1 经典类 DFS(深度优先遍历)
python2.2 引入新式类,经典类 DFS,新式类 BFS(广度优先遍历)
python2.3-2.7 经典类 DFS,新式类 C3
python3 新式类 C3

U型继承和菱形继承

U型继承

对于DFS算法,MRO(方法解析顺序)为:CAXBY,最终拿到X的hello方法,没有问题
对于BFS算法,MRO为:CABXY,最终拿到B的hello方法,有问题

菱形继承

对于DFS算法,MRO(方法解析顺序)为:CAXB,最终拿到X的hello方法,有问题
对于BFS算法,MRO为:CABX,最终拿到B的hello方法,没有问题

C3线性化算法

DFS和BFS都不能同时解决U型继承和菱形继承两种模式,如果想要解决,那就需要在现有算法基础上加以改造
C3算法在DFS深度遍历基础上增加了一步:删除坏的节点

什么是好的节点?什么是坏的节点?
当搜索路径中N节点之后的节点都不继承N,则N节点为好的节点,否则为坏的节点
比如对于菱形继承,DFS之后得到搜索路径为CAXBX,由于X节点被后面的B节点继承,X节点为坏的节点,所以删除X节点,得到MRO顺序为CABX

区分搜索路径和MRO顺序:
上面的MRO顺序是在搜索路径的基础上删除了重复节点,比如菱形继承DFS得到的搜索路径为CAXBX,删除X得到MRO为:CAXB

总结

C3算法在DFS基础上(DFS满足U型继承)做了扩展,从而同时解决了U型继承和菱形继承两个问题。

原文地址:https://www.cnblogs.com/Peter2014/p/12411272.html

时间: 2024-10-11 03:51:46

python的MRO算法的相关文章

Python多继承之MRO算法

MRO即Method Resolution Order   方法解析顺序,它的提出主要是为了解决Python中多继承时,当父类存在同名函数时,二义性的问题 下面先看一个例子: import inspect class D: pass class C(D): pass class B(D): pass class A(B, C): pass if __name__ == '__main__': print(inspect.getmro(A)) B和C继承D   A继承B和C  这是一个简单的多继承

使用python实现森林算法方法步骤详解

本文和大家分享的是使用python实现森林算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 算法描述 随机森林算法 决策树运行的每一步都涉及到对数据集中的最优**点(best split point)进行贪婪选择(greedy selection). 这个机制使得决策树在没有被剪枝的情况下易产生较高的方差.整合通过提取训练数据库中不同样本(某一问题的不同表现形式)构建的复合树及其生成的预测值能够稳定并降低这样的高方差.这种方法被称作引导**算法(bootstrap aggrega

python数据结构与算法 38 分析树

分析树 树的结构完成以后,该是时候看看它能做点什么实事儿了.这一节里,我们研究一下分析树.分析树能够用于真实世界的结构表示,象语法或数学表达式一类的. 图1 一个简单语句的分析树 图1所示是一个简单语句的层级结构,把语句表示为树结构可以让我们用子树来分析句子的组成部分. 图2 ((7+3)?(5?2))的分析树 我们也可以把数学表达式如((7+3)?(5?2))表示为分析树,如图2.此前我们研究过完全括号表达式,这个表达式表达了什么呢?我们知道乘法的优先级比加减要高,但因为括号的关系,在做乘法之

算法抽象及用Python实现具体算法

一.算法抽象 它们一般是在具体算法的基础上总结.提炼.分析出来的,再反过来用于指导解决其它问题.它们适用于某一类问题的解决,用辩 证法的观点看,抽象的算法和具体的算法就是抽象与具体.普遍性与特殊性.共性和个性的关系.马是白马的抽象,无论是白马还是红 马,都是马,我们用马的唯一本质属性--染色体来决定一种动物是否是马,这个本质属性就是马的抽象. (1)分治法 分治法的基本思想是先分割原问题,将原问题分割成一个或多个简单的子问题,这些子问题的解经过一定组合得到原问题的解,而求 解这些子问题时,常常会

python数据结构与算法 36 树的基本概念

树 学习目标 理解什么是树及使用方法 学会使用树实现映射 用列表实现树 用类和引用实现树 用递归实现树 用堆实现优先队列 树的例子 前面我们学习过栈和队列这类线性数据结构,并且体验过递归,现在我们学习另一种通用数据结构,叫做树.树在计算机科学中应用广泛,象操作系统.图形学.数据库系统.网络等都要用到树.树和他们在自然界中的表哥--植物树--非常相似,树也有根,有分枝,有叶子.不同之处是,数据结构的树,根在顶上,而叶子在底部. 在开始学习之前,我们来研究几个普通的例子.第一个是生物学上的分级树.图

python实现快速排序算法(两种不同实现方式)

# -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix """ #快速排序 import sys import random length = 30 def qsort(arr,left,right): lp = left rp = right if lp == rp:return while True: while arr[lp] >=

用python实现欧几里德算法求最大公约数

方法1: def gcd(x, y):   while n:       x, y = y, x % y   return x 方法2: def yue(x,y):      if y:              return gcd(y,x%y)      else:            return x 用python实现欧几里德算法求最大公约数,布布扣,bubuko.com

Python 数据结构和算法

一.写在前面 这篇文章主要介绍了python 内置的数据结构(list.set以及字典),从一些实际的场景中来说明解决方案,主要是阅读<python cookbook>时写下的阅读记录,提高自己在Python开发方面的理解,记录在这里是为了方便可以随时查阅使用.因为时间仓促以及个人理解有限,固有错误的地方请指出,谢谢! 如果转载,请保留作者信息. 邮箱地址:[email protected] 个人博客:http://www.smallartisan.site/ CSDN博客:http://bl

python数据结构与算法 37 树的实现

树的实现 记住上一节树的定义,在定义的基础上,我们用以下的函数创建并操作二叉树: BinaryTree() 创建一个二叉树实例 getLeftChild() 返回节点的左孩子 getRightChild() 返回节点的右孩子 setRootVal(val) 把val变量值赋给当前节点 getRootVal() 返回当前节点对象. insertLeft(val) 创建一个新二叉树作为当前节点的左孩子 insertRight(val) 创建一个新二叉树作为当前节点的右孩子. 实现树的关键点是合适的存