博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python面向对象(C3算法)(六)
阅读量:5807 次
发布时间:2019-06-18

本文共 1483 字,大约阅读时间需要 4 分钟。

1. 了解python2和python3类的区别

    python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类

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

class A:    passclass B(A):    passclass C(A):    passclass D(B, C):    passclass E:    passclass F(D, E):    passclass G(F, D):    passclass H:    passclass Foo(H, G):    pass

  从左到右,深度递归,一直到头再返回

  Foo -> H -> G -> D -> B -> A -> C -> E

3. 新式类的MRO C3算法

 拿第一项的第一位和 后面每项的除了第一位比较. 如果没有出现, 则该位元素算出如果出现了. 此时开始下一项的第一位继续和后面每一项的除了第一位比较:

 

    用头和身体比较

 方法:   1. 拆分

 

       2. 合并

class A:    passclass B(A):    passclass C(A):    passclass D(B, C):    passclass E(C, A):    passclass F(D, E):    passclass G(E):    passclass H(G, F):    pass
L(H) = H + L(G) + L(F) + GF # ECA + DBECA  = HGFDBECAO L(G) = G + L(E) + E # GECA L(E) = E + L(C) + L(A) + CA # ECA L(C) = C + L(A) + A  # CA L(A) = A L(F) = F + L(D) + L(E) + DE # FDBECA L(D) = D + L(B) + L(C) + BC # DBCA L(B) = B + A + A   # BA 与Python中使用H.__mro__运行的结果相同
(
,
,
,
,
,
,
,
,
)
4. super() 找MRO顺序的下一个

 

class Base1:    def chi(self):        super().chi()         print("Base1")class Base2:    def chi(self):        super().chi()        print("Base2")class Base3:    def chi(self):        print("Base3")class Bar(Base1, Base2, Base3):    def chi(self):        print("Bar里chi1")        super(Bar, self).chi()         print("Bar里chi2")b = Bar()

  结果 :Bar里chi1,Base3,Base2,Base1,Bar里chi2

转载于:https://www.cnblogs.com/fu-1111/p/10169953.html

你可能感兴趣的文章
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
Angular2, NativeScript 和 React Native比较[翻译]
查看>>
论模式在领域驱动设计中的重要性
查看>>
国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
查看>>
微软将停止对 IE 8、9和10的支持
查看>>
微服务架构会和分布式单体架构高度重合吗
查看>>
如何测试ASP.NET Core Web API
查看>>
《The Age of Surge》作者访谈
查看>>
测试人员的GitHub
查看>>
Spring Web Services 3.0.4.RELEASE和2.4.3.RELEASE发布
查看>>
有关GitHub仓库分支的几个问题
查看>>
无服务器计算的黑暗面:程序移植没那么容易
查看>>
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
Webpack入门教程三十
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
Erlang学习总结之Erlang语法中的逗号(,)、分号(;),句号(.)的正确用法...
查看>>