the1fire

基于Django的个人博客系统

类和实例属性的查找顺序

分类:Python   作者:edward   创建时间:2019年5月8日 16:53   pv:148   uv:140

MRO(Method Resolution Order),方法解析顺序。在经典类中,Python中是深度优先,如下图:

深度优先

 

 

 

 

 

 

 

 

 

   
但是,深度优先无法解决菱形问题,如下图:

菱形问题

所在,新式类使用了广度优先的算法,如下图:

广度优先

但是广度优先又不适用于第一种情况,如下图,如果C和D有一样的方法,那么C的方法就会覆盖D的方法,但是B是继承自D的,B和D应该看做一个整体。因为C是没有继承D的,B又在C的前面,在B里找不到应该去B的父类D里面找。

为了解决这个问题从Python2.3一直到现在,Python的属性搜索算法使用了C3算法。C3算法既解决了菱形问题又解决了上面提到的单调性问题。

广度优先的缺点
 

菱形查找代码演示:

class D:
    pass


class C(D):
    pass


class B(D):
    pass


class A(B, C):
    pass


print(A.__mro__)  # A -> B -> C -> D

如果对下一个类存在两个合法的选择,选择第一个父类(图示第一种情况)

class D:
    pass


class E:
    pass


class C(E):
    pass


class B(D):
    pass


class A(B, C):
    pass


print(A.__mro__)  # A -> B -> D -> C -> E