python新式类和旧式类_Python中的新式类(new style class)和老式类(old style class)

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

参考资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值