python多重繼承

在多重繼承時尋找一個重載方法的順序(MRO)來自於C3算法,

方法是進行迭代:

class B(A1,A2,A3 ...)

這時B的mro序列 mro(B) = [B] + merge(mro(A1), mro(A2), mro(A3) ..., [A1,A2,A3,...])

當調用super(B,self).fun()時會按照上述順序調用各個父類的方法,一直到當某個類沒有調用super方法爲止


C3具體算法實現如下:

from exceptions import Exception


def c3_lineration(kls):

   if len(kls.__bases__) == 1:

       return [kls, kls.__base__]

   else:

       l = [c3_lineration(base) for base in kls.__bases__]

       l.append([base for base in kls.__bases__])

       return [kls] + merge(l)


def merge(args):

   if args:

       for mro_list in args:

           for class_type in mro_list:

               for comp_list in args:

                   if class_type in comp_list[1:]:

                       break

               else:

                   next_merge_list = []

                   for arg in args:

                       if class_type in arg:

                           arg.remove(class_type)

                           if arg:

                               next_merge_list.append(arg)

                       else:

                           next_merge_list.append(arg)

                   return [class_type] + merge(next_merge_list)

       else:

           raise Exception

   else:

       return []

class A(object):pass

class B(object):pass

class C(object):pass

class E(A,B):pass

class F(B,C):pass

class G(E,F):pass


print c3_lineration(G)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章