Python-37章 MRO
程序员文章站
2022-07-15 16:30:59
...
Python2和Python3之间的区别
Python2.4之前使用的是经典类,2.4之后使用的是新式类
经典类继承
MRO method resolution order 方法的查询顺序
经典类的MRO : 树形结构的深度优先遍历
执行过程中会依次从左到右,深度递归,向上寻找继承关系,依次顺藤摸瓜找上去
此时的执行顺序:G->C->A->B->F->D->E
从左向右依次寻找.并且经典类不会重复寻找,深度优先会先将一条分支走到头,然后再去找下一个分支.
由于现在已经淘汰了Python2,所以了解下就好
新式类的MRO: C3算法
Python不存在广度优先,并且广度优先是很慢的
拆分
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 G(E):
pass
class H(G, F):
pass
# 求H的 MRO
'''
Python3中所有的类都默认继承object
设求MRO的算法是L
L(H) = H + L(G) + L(F) + GF
L(G) = G + L(E) + E
L(E) = E + L(C) + L(A) + CA
L(C) = C + L(A) + A
L(A) = A
L(F) = F + L(D) + L(E) + DE
L(D) = D + L(B) + L(C) + BC
L(B) = B + L(A) + A
加法:merge()
DBCA + ECA => D
# 拿第一项的第一位和后面每项的除了第一位进行比较,如果没有出现,则该位元素被算出
BCA + ECA => B
#如果出现了,此时,继续开始下一项的第一位(第一项的C在第二项出现了,开始第二项的第一位,但是第二项后面没有了,输出E)
CA + ECA => E
CA + CA => CA
'''