python __mro__ c3算法

来源:互联网 发布:安卓smali转java 编辑:程序博客网 时间:2024/06/10 03:56
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): passclass B(dict ): passclass 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)

原创粉丝点击