(转)pythonC3线性算法
本文转自:http://kaiyuan.me/2016/04/27/C3_linearization/
作者:Kaiyuan
注意:本文仅仅作为个人mark,所以排版并不如原文,另本文在原文基础上做了一些修改,但由于本人技术实力尚浅,所作修改可能会误导读者,建议到原文查看。
在介绍算法之前,我们首先约定需要使用的符号。我们用 C1 C2⋯CN 表示包含 N 个类的列表,并令
head(C1 C2⋯CN)=C1
tail(C1 C2⋯CN)=C2 C3⋯CN
为了方便做列表连接操作,我们记:
C1+(C2 C3⋯CN)=C1 C2⋯CN
假设类 C 继承自父类 B1,⋯,BN那么根据 C3 线性化,类 C 的方法解析列表通过如下公式确定:
L[C(B1⋯BN)]=C+merge(L[B1],⋯,L[BN],B1⋯BN)
这个公式表明 C 的解析列表是通过对其所有父类的解析列表及其父类一起做 merge 操作所得到。
接下来我们介绍 C3 线性化中最重要的操作 merge,该操作可以分为以下几个步骤:
- 选取 merge中的第一个列表记为当前列表 K。
- 令 h=head(K),如果 h 没有出现在其他任何列表的 tail 当中,那么将其加入到类 C 的线性化列表中,并将其从 merge 中所有列表中移除,之后重复步骤 1和2。
- 否则,设置 K 为 merge 中的下一个列表,并重复 2 中的操作。
- 如果 merge中所有的类都被移除,则输出类创建成功;如果不能找到下一个 h,则输出拒绝创建类 C 并抛出异常。
上面的过程看起来好像很复杂,我们用一个例子来具体执行一下,你就会觉得其实还是挺简单的。假设我们有如下的一个类继承关系:
class A(object): def __init__(self):
print("enter A")
super(A, self).__init__()
print("leave A") class B(object): def __init__(self):
print("enter B")
super(B, self).__init__()
print("leave B") class C(object): def __init__(self):
print("enter C")
super(C, self).__init__()
print("leave C") class D(A): def __init__(self):
print("enter D")
super(D, self).__init__()
print("leave D") class E(A, C): def __init__(self):
print("enter E")
super(E, self).__init__()
print("leave E") class F(D, B): def __init__(self):
print("enter F")
super(F, self).__init__()
print("leave F") class G(E, F): def __init__(self):
print("enter G")
super(G, self).__init__()
print("leave G") """
l[F(D, B)] = F + merge(l(D), l(B), DB)
F + merge([D, A], B, [D, B])
[F, D, A, B]
l[G(E, F)] = G + merge(l(E), l(F), EF)
G + merge([E, A, C], [F, D, A, B], [E, F])
[G, E, F, D, A, C, B] """ print(G.mro())
(转)pythonC3线性算法的更多相关文章
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
这段时间笔者几篇文章介绍了改算法线性的文章. 关联文章的地址 这个算法我在我的博客里应用动态规划做过,详细实现请参阅我的dp板块,下面给出书上最快的算法,时间复杂度为O(n),称之为线性算法. #in ...
- Python多继承解析顺序的C3线性算法流程解析
Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和 ...
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
一.背景介绍 强连通分量是有向图中的一个子图,在该子图中,所有的节点都可以沿着某条路径访问其他节点.强连通性是一种非常重要的等价抽象,因为它满足 自反性:顶点V和它本身是强连通的 对称性:如果顶点V和 ...
- Bzoj2882 工艺 [线性算法]
后缀自动机题解 -> http://www.cnblogs.com/SilverNebula/p/6420601.html 后缀自动机敲完,看了下排行,wc为什么别人跑得这么快?……是诶,这最小 ...
- 机器学习---三种线性算法的比较(线性回归,感知机,逻辑回归)(Machine Learning Linear Regression Perceptron Logistic Regression Comparison)
最小二乘线性回归,感知机,逻辑回归的比较: 最小二乘线性回归 Least Squares Linear Regression 感知机 Perceptron 二分类逻辑回归 Binary Logis ...
- FZU 1914 Funny Positive Sequence(线性算法)
这个当时我没有做出来,看了很多人包括学长的代码才懂,我感觉最好的方法还是下面那一种,标记以谁开头的是不行的,我感觉有点不好理解,如果不懂举组样例在纸上写一下就会比较清楚了 #include<io ...
- 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)
计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...
- Python 查找算法_众里寻他千百度,蓦然回首那人却在灯火阑珊处(线性、二分,分块、插值查找算法)
查找算法是用来检索序列数据(群体)中是否存在给定的数据(关键字),常用查找算法有: 线性查找: 线性查找也称为顺序查找,用于在无序数列中查找. 二分查找: 二分查找也称为折半查找,其算法用于有序数列. ...
随机推荐
- WordPress留言本插件推荐
WordPress不借助于任何插件也可以做个留言本,那就是建个 Page, 直接使用它的评论功能即可,而且给评论加上 Ajax 功能.WYSIWYG.引用.回复.留言分页等功能也可以做的很漂亮.但对于 ...
- Please restart this script from an administrative PowerShell
问题 在上一篇<MSBUILD : error MSB3428: 未能加载 Visual C++ 组件"VCBuild.exe">,安装时失败了,提示: 解决办法 1. ...
- 最简单的XML用法
在传递数据时,XML和JSON是最常用的数据格式,SQL Server从很早的版本就开始支持XML格式,而对于JSON格式,SQL Server从2016版本开始支持.大多数数据库系统并没有升级到SQ ...
- centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)
写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...
- Python魔术世界 1 如何使用Visual Studio在WIN10中一键安装Python3入门编程环境并测试Django
本文通过VS安装Python和Django的环境,创建了一个Web程序,前后5分钟的操作,让你快速入门Python的编程世界,各种Python和Django的概念会在实战中给你娓娓道来. Django ...
- Linux 上传代码到github
1.git init 初始化 2.git clone将刚刚创建的项目克隆下来 git clone https://github.com/... 3.进入到Project,编写代码 4.项目完成后执行g ...
- 了不起的Node.js--之一
在OSX下安装Nodejs 从Node.js官网下载PKG文件,其文件名格式遵循node-v.?.?.?.pkg.若要通过手动编译来进行安装,请确保机器上已安装了XCode,然后根据Linux下的编译 ...
- Arcengine效率探究之二——属性的更新(转载)
http://blog.csdn.net/lk103852503/article/details/6570748 修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IR ...
- 转发npm发布包的过程
老板,来个npm账号! 因为你的包是要放在npm上的,所以,没有npm的账号,根本什么活都干不了. 在npm上注册一个账号是很简单的,随便填一下用户名密码邮箱,然后人家就会发个邮件给你,然后就注册成功 ...
- Android开发环境的发展演变调研
Android开发环境的发展演变调研 前几年比较多的方法是用JDK+eclipse+ADT,该方法除了要配置JDK的路径之外, 还要在eclipse里面打开SDK Manage进行相应的操作.不过近两 ...