mro c3算法

 1了解python2和python3类的区别    python2在2.4之前使用的是经典类, 2.4之后, 使用的是新式类

class Foo:        pass

class Foo(object):        pass

MRO: method resolution order 方法的查找顺序

class Base:        pass

class Base1:        def chi():            pass

class Bar(Base, Base1):        pass

b = Bar() # Bar -> Base -> Base1    b.chi()

2. 经典类的MRO 树形结构的深度优先遍历 -> 树形结构遍历

3. 新式类的MRO C3算法(难点, 重点)    1. 拆分    2. 合并

用头和身体比较

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

class A:

    pass

class B(A):

    pass

class C(A):

    pass

class D(B, C):

    pass

class E(C, A):

    pass

class F(D, E):

    pass

class M:

    pass

class N(M):

    pass

class P(E, A):

    pass

class X:

    pass

class Q(P,N,X):

    pass

class G(Q, F):

    pass

class H(G, F):

    pass

# L(A) = A

# L(B) = B + L(A) + A

# L(C) = C + L(A) + A

# L(D) = D + L(B) + L(C) + BC

# L(E) = E + L(C) + L(A) + CA

# L(F) = F + L(D) + L(E) + DE

# L(M) = M

# L(N) = N + L(M) + M

# L(P) = P + L(E) + L(A) + EA

# L(X) = X

# L(Q) = Q + L(P) + L(N) + L(X) +PNX

# L(G) = G + L(Q) + L(F) + QF

# L(H) = H + L(G) + L(F) + GF

#

#

# L(A) = A

# L(B) = B + L(A) + A             # BA

# L(C) = C + L(A) + A             # CA

# L(D) = D + L(B) + L(C) + BC     # DBCA

# L(E) = E + L(C) + L(A) + CA     # ECA

# L(F) = F + L(D) + L(E) + DE     # FDBECA

# L(M) = M

# L(N) = N + L(M) + M             # NM

# L(P) = P + L(E) + L(A) + EA     # PECA

# L(X) = X

# L(Q) = Q + L(P) + L(N) + L(X) +PNX  # QPECANMX

# L(G) = G + L(Q) + L(F) + QF     # GQPFDBECANMX

# L(H) = H + L(G) + L(F) + GF     # HGQPFDBECANMX

  

原文地址:https://www.cnblogs.com/heheda123456/p/10204827.html

时间: 2024-08-29 01:55:10

mro c3算法的相关文章

python的继承,多继承,经典类的MRO,新式类的MRO,C3算法,super

#继承 class JiaoFu: def qd(self): print("教父带你祈祷") class Fu: def msj(self): print("alex喜欢msj") class Zi(Fu, JiaoFu): def dbj(self): print("刘伟喜欢大宝剑") z = Zi() z.msj() z.dbj() z.qd() class Base1: # Base1 object def func(self): pri

Python基础13_类与类型, MRO, C3算法, super()

一. python多继承 类与类型:http://www.cnblogs.com/blackmatrix/p/5594109.html 子类继承了多个父类, 当父类出现了重名方法时, 这时就涉及到查找父类方法的问题, 即MRO(method resolution order)问题 python中有两种类, 经典类和新式类 在Python2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的特性:反

21 MRO C3算法

三十九 MRO 多继承的继承顺序 一.python2.2之前用的是   经典类的MRO继承 ①深度递归继承     从左到右 ,一条路走到黑 ②广度继承           一层一层的继承 深度继承时   为   R 1 2 3 4 5 6 广度继承时  为    R 1 4 2 3  5 6 二.python2.2 之后用的是      新式的MRO继承    C3算法 1.拆分 2.合并 拆分 合并 直接打印时 三.  super( ).方法          找MRO  顺序的下一项 su

python中的MRO和C3算法

一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python3的区别 python2中存在两种类,一个叫经典类,在python2.2之前,一直使用的经典类.经典类是在基类的根如果什么都不写.表示继承xxx 另一个叫做心事类,在python2.2之后出现了心事类.新式类的特点是基类的根是object python3中使用的都是新式类.如果基类谁都不继承,那这个

python的MRO和C3算法

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

mro之C3算法

mro之C3算法 # C3算法 归并算法 class A(object): pass class B(A): pass class C(A): pass class D(B): pass class E(C): pass class F(D, E): pass print(F.__mro__) ######################### # 第一步先找到继承的父类的MRO # D = [D, B, A, O] # E = [E, C, A, O] # 第二步 把父类这两个MRO 和 DE

16 继承 MRO和C3算法

一 多继承 Python中类与类之间可以有继承关系. 当出现了了x是一种y的的时候. 就可以使用继承关系. 即"is-a" 关系.  在继承关系中. 子类自动拥有父类中除了了私有属性外的其他所有内容.  python支持多继承. 一个类可以拥有多个父类. class ShenXian: # 神仙 def fei(self): print("神仙都会飞") class Monkey: # 猴 def chitao(self): print("猴?喜欢吃桃子&

6.MRO和C3算法

经典类的MRO python3以不存在经典类 class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E: pass class F(D, E): pass class G(F, D): pass class H: pass class Foo(H, G): pass 分析 类的MRO顺序是 foo->H->G->F->D->B->A->C->E,从左往右的顺序 新式

Python新式类继承的C3算法

在Python的新式类中,方法解析顺序并非是广度优先的算法,而是采用C3算法,只是在某些情况下,C3算法的结果恰巧符合广度优先算法的结果. 可以通过代码来验证下: class NewStyleClassA(object): var = 'New Style Class A' class NewStyleClassB(NewStyleClassA): pass class NewStyleClassC(NewStyleClassA): var = 'New Style Class C' class