Python多重继承排序原理

  参考:https://www.jianshu.com/p/c9a0b055947b

     https://xubiubiu.com/2019/06/10/python-%E6%96%B9%E6%B3%95%E8%A7%A3%E6%9E%90%E9%A1%BA%E5%BA%8Fmro-c3%E7%AE%97%E6%B3%95/

  

  类C的线性化记忆为L[C]=[C1,C2,...Cn],其中C1称为L[C]的头,其余元素[C2,...Cn]称为尾。如果一个类C继承自基类B1,B2,...,B那么L[C]的计算过程为

  

#类object为最高父类,所有类都继承object
L[objicet]=[object]
L[C(B1,B2,...Bn)]=[C]+merge(L[B1],L[B2],[B1,B2,...Bn])

  merge是将一组列表输出为一个列表,其过程为

1,检查第一个列表的头元素,记做H
2,如果H是后续序列的第一个元素,或者不在后续序列中再次出现,则将其输出,并将其从所有列表中删除,如果不符合跳过此元素,查找下一个列表的第一个元素,然后回到步骤1
3,重复上述步骤,直至列表为空或者不能再找出可以输出的元素。

  举例说明

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

 

  首先object,A,B的线性化结果比较简单

L[object]=[object]
L[A]=[A,object]
L[B]=[B,object]

  python内置变量__mro__存储了

>>> object.__mro__
(<class 'object'>,)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class 'object'>)

  需要计算出L[C]

L[C]=[C]+merge(L[A],L[B],[A,B])
    =[C]+mergr([A,object],[B,object],[A,B])
	#取得的第一个元素是A,是序列[A,B]的第一个元素所以输出A并且将A从所有列表中删除
	=[C,A]+merge([object],[B,object],[B])
	#取得的元素为object不满足条件,object是序列[B,object]的最后一个元素,跳过取到元素为B,满足条件,将B输出并从所有列表删除B
	=[C,A,B]+merge([object],[object])
	#最后的结果
	=[C,A,B,object]

  使用__mro__验证计算结果正确

>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

  一个复杂的例子

class B(object): pass

class C(object): pass

class D(A,C): pass

class E(B,C): pass

class F(D,E): pass

  计算过程

L[F] = [F] + merge(L[D], L[E], [D, E])
     = [F] + merge([D, A, C, object], [E, B, C, object],  [D, E])
     = [F, D] + merge([A, C, object], [E, B, C, object],  [E])
     = [F, D, A] + merge([C, object], [E, B, C, object], [E])
     = [F, D, A, E] + merge([C, object], [B, C, object])
     = [F, D, A, E, B] + merge([C, object], [C, object])
     = [F, D, A, E, B, C, object]

  验证计算结果

(<class '__main__.F'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)

  

猜你喜欢

转载自www.cnblogs.com/minseo/p/11102757.html
今日推荐