python mro c3_python之路--MRO和C3算法

一 . MRO(method resolution order)

多繼承的一種方法,一種查找的順序

在python3 里面是一種新類式MRO 需要用都的是C3算法

classA:pass

classB(A):pass

classC(A):pass

classD(B, C):pass

classE(C, A):pass

classF(D, E):pass

classG(E):pass

classH(G, F):pass

首先. 我們要確定從H開始找. 也就是說. 創建的是H的對象.

如果從H找. 那找到H+H的父類的C3, 我們設C3算法是L(x) , 即給出x類. 找到x的MRO.

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

繼續從代碼中找G和F的⽗類往⾥⾯帶

L(G) = G + L(E) + E

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

繼續找E 和 D

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

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

繼續找B和C

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

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

最后就剩下⼀個A了. 也就不⽤再找了. 接下來. 把L(A) 往⾥帶. 再推回去. 但要記住.

這⾥的 + 表⽰的是merge. merge的原則是⽤每個元組的頭⼀項和后⾯元組的除頭⼀項外的其他元素進⾏比較, 看是否存在.

如果存在. 就從下⼀個元組的頭⼀項繼續找. 如果找不到. 就拿出來.作為merge的結果的⼀項. 以此類推. 直到元組之間的元素都相同. 也就不⽤再找了.

L(B) =(B,) + (A,) + (A) -> (B, A)

L(C) =(C,) + (A,) + (A) -> (C, A)

繼續帶.

L(E) = (E,) + (C, A) + (A) + (C,A) -> E, C, A

L(D) = (D,) + (B, A) + (C, A) + (B, C) -> D, B, C, A

繼續帶.

L(G) = (G,) + (E, C, A) + (E) -> G, E, C, A

L(F) = (F,) + (D, B, C, A) + (E, C, A) + (D, E)-> F, D, B, E, C, A

加油, 最后了

L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) + (G, F) -> H, G, F, D, B, E, C, A

算完了. 最終結果 HGFDBECA. 那這個算完了. 如何驗證呢? 其實python早就給你准備好了. 我們可以使⽤類名.__mro__獲取到類的MRO信息.

print(H.__mro__) 結果: (, , ,

'__main__.D'>, , ,

'__main__.C'>,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,每个类都有一个特殊的属性__mro__,它表示了方法解析顺序(Method Resolution Order),即在多继承中方法的查找顺序。__mro__是一个元组,按照从左到右的顺序列出了类的继承顺序。 在经典类的深度遍历中,方法解析顺序是按照继承顺序从左到右进行搜索的。而在Python 2.2的新式类中,方法解析顺序是预先计算的。而在Python 2.3之后的新式类中,采用了C3算法来确定方法解析顺序。C3算法Python 3唯一支持的方式。 C3算法的目的是解决Python 2.2中方法解析顺序存在的问题。在Python 2.3及以后的版本中,如果存在具有二义性的继承关系,将会产生一个异常,禁止创建这样的类。 所以,如果你想知道一个类的方法解析顺序,你可以查看它的__mro__属性。例如,在Python中执行以下代码: ``` class A: pass class B: pass class C(A, B): pass print(C.__mro__) ``` 将会输出一个元组,按照方法解析顺序列出了C类的继承顺序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python的方法解析顺序(MRO)[转]](https://blog.csdn.net/weixin_30756499/article/details/98422260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值