python __mro__ c3算法
2011-11-29 21:39
253 查看
def mro_c3(*bases): if len(bases) == 1: if not bases[0].__bases__: return bases else: return bases + mro_c3(*bases[0].__bases__) else: seqs = [list(mro_c3(C)) for C in bases] + [list(bases)] res = [] while True: non_empty = list(filter(None, seqs)) if not non_empty: return tuple(res) for seq in non_empty: candidate = seq[0] not_head = [ s for s in non_empty if candidate in s[1:]] if not_head: candidate = None else: break if not candidate: raise TypeError('adfadsf') res.append(candidate) for seq in non_empty: if seq[0] == candidate: del seq[0]
比如:
class A(object): pass class B(dict ): pass class CC(A, B): pass
求CC.__mro__步骤是:(下面mro既mro_c3)
(CC) + mro((A,B))
(CC)+[mro(A), mro(B)] + [[A, B]]
(CC) + [ (A, object), (B, dict, object), [A,B]] ==> res =[]
(CC) + [ ( object), (B, dict, object), [B]] ==> res =[A]
(CC) + [ (object), (B, dict, object), [B]] ==> res =[A] #object 没有被加进res
(CC) + [ (object), ( dict, object), []] ==> res =[A,B]
(CC) + [ (object), ( dict, object)] ==> res =[A,B] #object 没有被加进res
(CC) + [ (object), ( object)] ==> res =[A,B, dict]
(CC) + [ ] ==> res =[A,B, dict, object]
(CC) + res => (CC, A, B, dict, object)
相关文章推荐
- python MRO:C3算法
- python MRO:C3算法
- sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO
- python mro
- python中的mro
- python的MRO方案
- python 零散记录(七)(下) 新式类 旧式类 多继承 mro 类属性 对象属性
- python中的MRO与多继承
- 你真的理解Python中MRO算法吗?[转]
- Python3 super与mro表
- Python MRO(Method Resolution Order)方法解析顺序
- python mro computing
- Python MRO
- Python 类继承,__bases__, __mro__, super
- Python的方法解析顺序(MRO)[转]
- Python中class的MRO(Method Resolution Order)
- python类学习以及mro--多继承属性查找机制
- 【Python基础】Python面向对象 - 7 - Mixin & MRO
- python super中的mro表
- Python 类继承,__bases__, __mro__, super