内容简介:Python2.3之前,使用的是老式继承,直接看例子:这样下来,方法查找链就是这样的:因此,不能再有一个新的类来继承 A 和 B,因为 A 的继承顺序是 X-Y,而 B 的继承顺序是 Y-X,那么到底是先在 X 里查找还是先在 Y 里查找呢?
Python2.3之前,使用的是老式继承,直接看例子:
>>> O = object >>> class X(O): pass >>> class Y(O): pass >>> class A(X,Y): pass >>> class B(Y,X): pass
这样下来,方法查找链就是这样的:
----------- | | | O | | / \ | - X Y / | / | / | / |/ A B \ / ?
因此,不能再有一个新的类来继承 A 和 B,因为 A 的继承顺序是 X-Y,而 B 的继承顺序是 Y-X,那么到底是先在 X 里查找还是先在 Y 里查找呢?
为了解决这个问题,引入了 C3 MRO,还是以例子来说明:
>>> O = object >>> class F(O): pass >>> class E(O): pass >>> class D(O): pass >>> class C(D,F): pass >>> class B(D,E): pass >>> class A(B,C): pass
那么方法查找链是这样:
6 --- Level 3 | O | (more general) / --- \ / | \ | / | \ | / | \ | --- --- --- | Level 2 3 | D | 4| E | | F | 5 | --- --- --- | \ \ _ / | | \ / \ _ | | \ / \ | | --- --- | Level 1 1 | B | | C | 2 | --- --- | \ / | \ / \ / --- Level 0 0 | A | (more specialized) ---
计算的时候就是:
L[O] = O L[D] = D O L[E] = E O L[F] = F O L[B] = B + merge(DO, EO, DE)
规则就是,以继承时的声明为顺序,每次取方法查找链的头一个,如果这个头不在后面的方法查找链的尾部,那么就把他放到方法查找链
里,首先方法查找肯定是在 B
里进行,然后是 merge(DO, EO, DE)
, D
是一个好的节点,因为 D
不在 DO, EO, DE
的尾部。然后是 O,O
在 EO
的尾部。然后是 E
,然后是 O
。
所以最后方法查找链就是 B -> D -> E -> O
。
同样,拿上面的例子来看,C3 MRO的查找顺序就应该是 A -> X -> Y -> B -> O
参考资料:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MultiCharts Powerlanguage 语法字典
MultiCharts中国技术顾问团队 / 东方出版社 / 2013-9-1 / 38
MC编程工具书,适用于MC7.4及8.5版本一起来看看 《MultiCharts Powerlanguage 语法字典》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
图片转BASE64编码
在线图片转Base64编码工具