Python和多重继承中的方法顺序

Python和多重继承中的方法顺序,第1张

Python和多重继承中的方法顺序

是的,可以保证,如介绍新算法以计算方法分辨率顺序(即C3线性化)的文档中所述。

不使用此算法的

mro
实现并不真正符合python语言(2.3版以上)。AFAIK当前所有实现 使用C3线性化。


C3线性化满足局部优先级排序和单调性。本地优先级排序意味着一类

C(B1, ..., Bn)
将在
mro
基类
Bi
中具有在继承列表中列出的顺序。

一个例子也许可以更好地解释单调性:

>>> class A(object): pass>>> class B(object): pass>>> class C(object): pass>>> class D(object): pass>>> class E(object): pass>>> class K1(A,B,C): pass>>> class K2(D,B,E): pass>>> class K3(D,A):   pass>>> class Z(K1,K2,K3): pass

python2.2的旧mro( 不是 单调的),这些是上述类的线性化:

L[A] = A OL[B] = B OL[C] = C OL[D] = D OL[E] = E OL[K1]= K1 A B C OL[K2]= K2 D B E OL[K3]= K3 D A OL[Z] = Z K1 K3 A K2 D B C E O# in current versions of python (2.3+):# L[Z] = Z K1 K2 K3 D A B C E O

在这里,您可以看到,在的线性化中

Z
,类位于
A
之前
D
,而在其线性化中
K3
则位于 之后
D
。单调性是线性化的属性,因此在继承时不存在此类交换。如果某个类
X
Y
其父级的所有线性化中均在类之前,则
Y
在最终线性化中它也将在类之前。

现在,如果我们考虑一堂课

C(B1, ..., Bn)
。按照局部优先顺序,这些类
B1, ...,Bn
将在的线性化中按该顺序找到
C
。通过单调性,我们无法
Bi
Bi
自身之前找到s的子类。由此可见,的线性化(
C
如果存在)必须以
C
和开头
B1

请注意,在某些情况下,您 无法 计算线性化,而python会抱怨,例如:

>>> class A(object):pass... >>> class B(object, A): pass... Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: Cannot create a consistent method resolutionorder (MRO) for bases object, A

但是,如果交换类,则可以线性化层次结构:

>>> class B(A, object): pass... >>> B.mro()[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]

如果父类没有共同的基数(

object
显然不是其他基数),那么显然的线性化
C(B1, ...,Bn)
将以
B1
(除外
object
)的线性化开始,然后将遵循
B2
etc的线性化,并将以:的线性化结束
Bn

>>> class A(object): pass... >>> class B(object): pass... >>> class A1(A): pass... >>> class A2(A1): pass... >>> class B1(B): pass... >>> class C(object): pass... >>> class C1(C): pass... >>> class C2(C1):pass... >>> class C3(C2): pass... >>> class D(A2, B1, C3): pass... >>> D.mro()[<class '__main__.D'>, <class '__main__.A2'>, <class '__main__.A1'>, <class '__main__.A'>, <class '__main__.B1'>, <class '__main__.B'>, <class '__main__.C3'>, <class '__main__.C2'>, <class '__main__.C1'>, <class '__main__.C'>, <class 'object'>]

Bi
s之间有一些通用子类时,事情开始变得怪异,在这种情况下python找到了您期望的不违反局部优先顺序和单调性的顺序,否则将引发错误。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4989921.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存