python多重继承顺序_Python和多重继承中的方法顺序

本文详细介绍了Python的C3线性化算法,这是一种用于确定类继承顺序的方法,保证了局部优先级排序和单调性。C3线性化确保了在多继承的情况下,类的mro(方法解析顺序)是确定且一致的。通过实例展示了线性化过程,并解释了为何某些继承结构会导致无法创建一致的MRO,从而引发错误。此外,还讨论了如何通过调整基类顺序来避免此类问题。
摘要由CSDN通过智能技术生成

小编典典

是的,可以保证,如介绍新算法以计算方法分辨率顺序(即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 O

L[B] = B O

L[C] = C O

L[D] = D O

L[E] = E O

L[K1]= K1 A B C O

L[K2]= K2 D B E O

L[K3]= K3 D A O

L[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 "", line 1, in

TypeError: Cannot create a consistent method resolution

order (MRO) for bases object, A

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

>>> class B(A, object): pass

...

>>> B.mro()

[, , ]

如果父类没有共同的基数(object显然不是其他基数),那么显然的线性化C(B1, ...,

Bn)将以B1(除外object)的线性化开始,然后将遵循B2etc的线性化,并将以:的线性化结束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()

[, , , , , , , , , , ]

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

2021-01-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值