Python3 多继承的MRO算法选择。MRO(Method Resolution Order):方法解析顺序。
Python3 只保留了C3算法! C3算法解析: 1.C3算法解析
C3算法:MRO是一个有序列表L,在类被创建时就计算出来了。
L(Child(Base1, Base2)) = [Child + merge(L(Base1), L(Base2), Base1Base2)]
L(object) = [object]
L的性质:结果为列表,列表中至少有一个元素即类自己。
+ :添加到列表的末尾,即[A + B] = [A, B]
merge :
1)如果列表为空则结束,非空读merge中第一个列表的表头
2)查看该表头是否在merge中所有列表的表尾中
2)-->3)不在,则放入最终的L中,并从merge中的所有列表中删除,然后回到1)
2)-->4)在,查看当前列表是否是merge中的最后一个列表
4)-->5)不是,跳过当前列表,读merge中下一个列表的表头,然后回到2)
4)-->5)是,异常。类定义失败。
需要了解一些词的意思:
表头:列表的第一个元素(列表:ABCD,那么表头就是A,B,C,D都是表尾)
表尾:列表中表头以为的元素集合(也可以为空)
merge 简单的说就是寻找合法表头(也就是不在表尾中的表头),如果所有表中都未找到合法表头则异常 2.例子
<1>
L(D) = L(D(O))
= D + merge(L(O))
= D + O
=[D, O] class D:
pass print(D.mro())#[<class '__main__.D'>, <class 'object'>]

<2>
L(B) = L(B(D,E))
= B + merge(L(D) , L(E))
= B + merge(DO , EO) # 第一个列表DO的表头D,其他列表比如EO的表尾都不含有D,所以可以将D提出来,即D是合法表头
= B + D + merge(O , EO) #从第一个开始表头是O,但是后面的列表EO的表尾中含有O所以O是不合法的,所以跳到下一个列表EO
= B + D + E + merge(O , O)
= [B,D,E,O] class D:
pass class E:
pass class B(D, E):
pass print(B.mro())#[<class '__main__.B'>, <class '__main__.D'>, <class '__main__.E'>, <class 'object'>]

<3>
L(C) = [C,E,F,O]
L(A(B,C)) = A + merge(L(B),L(C),BC)
= A + merge(BDEO,CEFO,BC)#B是合法表头
= A + B + merge(DEO,CEFO,C)#D是合法表头
= A + B + D + merge(EO,CEFO,C)#E不是合法表头,跳到下一个列表CEFO,此时C是合法表头
= A + B + D + C + merge(EO,EFO)#由于第三个列表中的C被删除,为空,所以不存在第三个表,只剩下两个表;此时E是合法表头
= A + B + D + C + E + merge(O,FO)#O不是合法表头,跳到下一个列表FO,F是合法表头,
= A + B + D + C + E + F + merge(O,O)#O是合法表头
= A + B + D + C + E + F + O
= [A,B,D,C,E,F,O] class D:
pass class E:
pass class F:
pass class B(D, E):
pass class C(E, F):
pass class A(B, C):
pass print(A.mro())#[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class 'object'>]


Python多继承C3算法的更多相关文章

  1. python --- 21 MRO C3算法

    一.python2.2之前用的是   经典类的MRO继承 ①深度递归继承     从左到右 ,一条路走到黑 ②广度继承           一层一层的继承 深度继承时   为   R 1 2 3 4 ...

  2. 面向对象多继承(c3算法)、网络基础和编写网络相关的程序

    一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): pass class B(object): def f1(self): print('B') ...

  3. 面向对象多继承(C3算法)/网络编程

    https://www.cnblogs.com/aylin/p/5572104.html 一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): p ...

  4. python中多继承C3算法研究

    在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...

  5. python学习 day20 (3月27日)----(单继承多继承c3算法)

    继承: 提高代码的重用性,减少了代码的冗余 这两个写法是一样的 Wa('青蛙').walk() #青蛙 can walk wa = Wa('青蛙') wa.walk() #青蛙 can walk 1. ...

  6. python新式类继承------C3算法

    一.引入 mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类).之前查看了很多资料,说mro是基于深度优先搜索算法的.但不完全正确在Python ...

  7. Python多重继承顺序---C3算法

    什么是多重继承C3算法 MRO即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类). 在python2.2版本中,算法基本思想是根据每 ...

  8. 多继承c3算法

    一.mro mro即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类). print(类.mro)得到属性路径按继承顺序 在pytho ...

  9. python MRO及c3算法

    1. 了解python2和python3类的区别 python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类 2. 经典类的MRO 树形结构的深度优先遍历 -> 树形结构遍历 cl ...

随机推荐

  1. freemaker开发

    推荐书籍 百度云盘 密码: c3m9 1. 前言 本书为<FreeMarker 2.3.19 中文版手册>,包含了freemarker开发得方方面面,可以作为开发freemarker的字典 ...

  2. zkeacms源码解读一

    1,app.UseZKEACMS 中注册可识别的路由 其中 CMS_Redirection 表中填写了跳转路由  对应的UrlRedirectService中将会读取所有的跳转规则. 有两个路由规则很 ...

  3. 51nod 1218 最长递增子序列 V2——LIS+思路(套路)

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 自己怎么连这种 喜闻乐见的大水题 都做不出来了…… 好像见过 ...

  4. jdk、tomcat如何配置环境变量

    一.安装JDK和Tomcat 1,安装JDK:直接运行jdk-7-windows-i586.exe可执行程序,默认安装即可. 备注:路径可以其他盘符,不建议路径包含中文名及特殊符号. 2.安装Tomc ...

  5. 优化EF的性能

    Entity Framework的性能优化: 1.使用MergeOption.NoTracking  (发现添加这个代码后, 导致"The object cannot be deleted ...

  6. Lagom学习 五 Hello world工程

    用Maven创建一个Hello world的Lagom工程: 1: 在想创建工程的目下下,打开CMD 2:  mvn archetype:generate -Dfilter=com.lightbend ...

  7. 反射:newInstance()的使用方式

    通过反射创建新的类示例,有两种方式: Class.newInstance() Constructor.newInstance() 以下对两种调用方式给以比较说明: Class.newInstance( ...

  8. RestClient(接口请求)

    一.电子签章:通过接口,传入参数中有pdf文件,和其他参数,在文件上盖上电子签章. 引入:通过NuGet安装RestSharp,注意版本. 备注:如果后面程序运行有错,可以看是引用是否更改了web.c ...

  9. H.264有四种画质级别

    H264相关知识-poseidonqiu-ChinaUnix博客 H.264有四种画质级别分别是BP.EP.MP.HP: 1.BP-Baseline Profile:基本画质.支持I/P 帧,只支持无 ...

  10. JavaScript高级程序设计学习笔记第八章--BOM

    1.间歇调用和超时调用: 超时调用:需要使用 window 对象的 setTimeout()方法,它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中,第一个参数可以 ...