python2类和python3类的区别
pyhon2中才分新式类与经典类,python3中统一都是新式类
Python 2.x中默认都是经典类,只有显式继承了object才是新式类
python 3.x中默认都是新式类,经典类被移除,不必显式的继承object
改变了经典类中一个多继承的bug,因为其采用了广度优先的算法

 1 class A(object):
2 def test(self):
3 print('from A')
4
5 class B(A):
6 def test(self):
7 print('from B')
8
9 class C(A):
10 def test(self):
11 print('from C')
12
13 class D(B):
14 def test(self):
15 print('from D')
16
17 class E(C):
18 def test(self):
19 print('from E')
20
21 class F(D,E):
22 # def test(self):
23 # print('from F')
24 pass
25 f1=F()
26 f1.test()
27 print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性
28 #新式类继承顺序:F->D->B->E->C->A
29 #经典类继承顺序:F->D->B->A->E->C

MRO: method resolution order 方法的查找顺序
经典类的MRO 树形结构的深度优先遍历 --> 树形结构遍历

 1 class A:
2 pass
3 class B(A):
4 pass
5 class C(A):
6 pass
7 class D(B, C):
8 pass
9 class E:
10 pass
11 class F(D, E):
12 pass
13 class G(F, D):
14 pass
15 class I:
16 pass
17 class J(B, C):
18 pass
19 class K(A):
20 pass
21 class H(I, J, K):
22 pass
23 class Foo(H, G):
24 pass
25 print(Foo.__mro__)
26 结果
27 Foo -->H-->I-->J-->G-->F-->D-->B-->C-->K-->A-->E-->'object'

新式类的MRO C3算法
1. 拆分
2. 合并

 1 class A:
2 pass
3 class B(A):
4 pass
5 class C(A):
6 pass
7 class D(B, C):
8 pass
9 class E(C, A):
10 pass
11 class F(D, E):
12 pass
13 class M:
14 pass
15 class N(M):
16 pass
17 class P(E, A):
18 pass
19 class X:
20 pass
21 class Q(P,N,X):
22 pass
23 class G(Q, F):
24 pass
25 class H(G, F):
26 pass
27
28
29 加法:merge(),拿第一项的第一位和后面项除了第一位的每位比较,如果没有出现,则该位元素算出
30 如果出现了,此时开始下一项的第一位继续和后面项除了第一位的每一位比较,
31 如果后边项里除了第一位的其他位出现有,则继续开始拿下一项的第一位和后一项除了第一位的其他位做比较
32 如果后边项没有出现,取完这一项的第一位后,重新返回第一项继续执行判断第一项的第一位与后边项除了第一位比较
33
34 比如
35 F + DBCA + ECA + DE
36 DBCA + ECA + DE
37 BCA + ECA + E
38 CA + CA
39 A + A
40
41 思路:
42 第一次拿第一项的第一位F与DBCA,ECA,DE比较,这三个数除了第一位后面的每一项都没有F出现,
43 所以把所有的F消除,取值F
44 第二次拿第二项DBCA的第一位D与ECA,DE比较,这两数中除了第一位后边的每一项都没有D出现,
45 所以就把所有的D消除,然后取值D
46 第三次拿第二项BCA的B与ECA,E比较,这两个数中除了第一位后边的每一项都没有B出现,
47 所以就把所有的B消除,取值B
48 第四次拿第二项CA的C与ECA,E比较,ECA出现了C,所以不动CA,然后拿下一项的ECA的第一位E与最后一项的值E做比较,
49 因为ECA的E重复了最后一项E,所以也不动ECA,然后拿最后一项的E与后边作比较,因为后边没项值,
50 所以消除所有的E,取值E
51 第四次拿返回开头拿第二项CA中的C与后边的项CA做比较,因为后边项中除了第一位,其他位没有C,
52 所以消除所有的C,取值C
53 第五次拿第二项的A与后边的项A做比较,因为后边项值有A,所有拿后边项A与后边项做比较,因为后边项没有值,
54 所以消除所有的A,取值A
55 结果
56 FDBECA
57
58
59 求H的MRO
60 设求MRO的算法是L
61 解析步骤:
62 拆分 合并
63 L(H) = H + L(G) + L(F) + GF #H + GQPFDBECANMX + FDBECA + GF = HGQPFDBECANMX
64 L(G) = G + L(Q) + L(F) + QF #G + QPECANMX + FDBECA + QF = GQPFDBECANMX
65 L(Q) = Q + L(P) + L(N) + L(X) + PNX #Q + PECA + NM + X + PNX = QPECANMX
66 L(X) = X #X
67 L(P) = P + L(E) + L(A) + EA #P + ECA + A + EA = PECA
68 L(N) = N + L(M) + M #N + M + M = NM
69 L(M) = M #M
70 L(F) = F + L(D) + L(E) + DE #F + DBCA + ECA + DE = FDBECA
71 L(E) = E + L(C) + L(A) + CA #E + CA + A + CA = ECA
72 L(D) = D + L(B) + L(C) + BC #D + BA + CA + BC = DBCA
73 L(C) = C + L(A) + A #C + A + A = CA
74 L(B) = B + L(A) + A #B + A + A = BA
75 L(A) = A #A
76 所以结果是
77 HGQPFDBECANMX
78
79 和电脑运算的结果一致
80 print(H.__mro__)

super() 找MRO顺序的下一个

 1 class Base1:
2 def chi(self):
3 print("我是Base1")
4
5 class Base2:
6 def chi(self):
7 print("我是Base2")
8
9 class Base3:
10 def chi(self):
11 print("我是Base3")
12
13 class Bar(Base1, Base2, Base3):
14 def chi(self):
15 print("我是Bar里面的chi1")
16 # super(类名, self) 从某个类开始找下一个MRO
17 super(Base2, self).chi() # 此时调用的super. 在Bar调用 -> super表示找MRO里的下一个
18 # super().chi() # super(Bar, self).chi()
19 print("我是Bar里面的chi2")
20
21 b = Bar() # Bar, Base1, Base2, Base3, object
22 b.chi()
23 print(Bar.__mro__)
24
25 结果:
26 我是Bar里面的chi1
27 我是Base3
28 我是Bar里面的chi2
29 (<class '__main__.Bar'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class '__main__.Base3'>, <class 'object'>)
30
31
32 事例2
33 class Base1:
34 def chi(self):
35 super().chi()
36 print("我是Base1")
37
38 class Base2:
39 def chi(self):
40 super().chi()
41 print("我是Base2")
42
43 class Base3:
44 def chi(self):
45 print("我是Base3")
46
47 class Bar(Base1, Base2, Base3):
48 def chi(self):
49 print("我是Bar里面的吃1")
50 super(Bar, self).chi()
51 print("我是Bar里面的吃2")
52
53 b = Bar()
54 b.chi()
55
56 结果
57 我是Bar里面的吃1
58 我是Base3
59 我是Base2
60 我是Base1
61 我是Bar里面的吃2

MRO + super 面试题

 1 class Init(object):
2 def __init__(self, v):
3 print("init")
4 self.val = v
5
6 class Add2(Init):
7 def __init__(self, val):
8 print("Add2")
9 super(Add2, self).__init__(val)
10 print(self.val)
11 self.val += 2
12
13 class Mult(Init):
14 def __init__(self, val):
15 print("Mult")
16 super(Mult, self).__init__(val)
17 self.val *= 5
18
19 class HaHa(Init):
20 def __init__(self, val):
21 print("哈哈")
22 super(HaHa, self).__init__(val)
23 self.val /= 5
24
25 class Pro(Add2,Mult,HaHa):
26 pass
27
28 class Incr(Pro): # incr->pro->add2->Mult->HaHa->init
29 def __init__(self, val):
30 super(Incr, self).__init__(val)
31 self.val += 1
32 p = Incr(5)
33 print(p.val)

python之MRO和C3算法的更多相关文章

  1. Python之MRO及其C3算法

    [<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...

  2. Python的多继承问题-MRO和C3算法

    大部分内容转载自C3 线性化算法与 MRO 理解Python中的多继承 Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释 ...

  3. day21 MRO和C3算法

    核能来袭 --MRO和C3算法 1. python的多继承 2.python经典类的MRO 3.python新式类的MRO, C3算法 4.super 是什么鬼? 一.python的多继承 在前面的学 ...

  4. python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件

    Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...

  5. python之路--MRO和C3算法

    一 . MRO(method resolution order) 多继承的一种方法,一种查找的顺序 在python3 里面是一种新类式MRO 需要用都的是C3算法 class A: pass clas ...

  6. python MRO及c3算法

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

  7. python中的MRO和C3算法

    一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...

  8. python摸爬滚打之day20--多继承,MRO和C3算法

    1.新式类和经典类 在python2.2之前, 基类如果不写(), 则表示为经典类; 在python2.2之后, 经典类不复存在, 只存在新式类. 如果基类谁都不继承的话, 则默认继承object. ...

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

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

随机推荐

  1. Spring Data Solr的分组查询 for 搜索面板的商品分类

    private List searchCategoryList(Map searchMap) { SimpleQuery query = new SimpleQuery(new Criteria(&q ...

  2. 电子技术经典资料汇总:PCB设计篇

    电子技术经典资料汇总:PCB设计篇,下面的链接是一个一个的文件下载的,也是压缩包的内容,只不过我把他们给汇总成了一个压缩包,方便大家下载,还有更多电子技术必备基础资料,通信无线类的,C语言篇的,关于电 ...

  3. Android精通之OrmLite数据库框架,Picasso框架,Okio框架,OKHttp框架

    版权声明:未经博主允许不得转载 OrmLite基础知识 什么是OrmLite框架,在我没用这个框架时,不知道它有多好,用了才知道很方便哦,为了提供开发效率,Android开发者需要懂得运行多种框架进行 ...

  4. 如何使用spring配合mybatis配置多个数据源并应用?

    使用多数据源的场景应该是很多的,如操作同一台服务器上不同的数据库,或者多地机器上的相同或不相同数据库. 虽然涉及到不同数据库时,我们也许可以通过跨库操作的方式,如 other.user 使用同一数据源 ...

  5. Liferay7 BPM门户开发之9: 流程表单数据动态映射体系

    设计目的: 每个流程表单涉及不同的表单变量.比如请假流程有3个任务节点,分别是 Task1:开始流程,填写请假人.请假原因.请假开始时间.请假结束时间: Task2:上级审批,填写是否同意,审批意见: ...

  6. 使用jedis连接redis

    1.导入jar包,添加pom依赖<dependency><groupId>redis.clients</groupId><artifactId>jedi ...

  7. HDU 6022---MG loves set(K-D树)

    题目链接 Problem Description MG is an intelligent boy. One day he was challenged by the famous master ca ...

  8. 程序员、互联网从业者必读KK凯文凯利三大力作之《失控》总结

  9. C语言第四讲,typedef 关键字,以及作用域

    C语言第四讲,typedef 关键字,以及作用域 一丶typedef关键字 在C语言中,有typedef 关键字,这个关键字的作用就是允许你为类型定义一个新的名字,也就是 起个别的名字 例如: typ ...

  10. Crypto++应用:非对称加密RSA

    1,非对称加密RSA: (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后用它对信息加密. (3)乙方得到加密后的信息,用私钥解密. ...