概述
在python2的经典类中,查找父类中的属性和方法时,深度优先。深度优先的情况会屏蔽掉,其他类中重写的一些方法。
在python3的类中,通过C3算法生成的MRO列表,则是广度优先。
C3算法
如计算merge( [E,O], [C,E,F,O], [C] )
有三个列表 : ① ② ③
1 merge不为空,取出第一个列表列表①的表头E,进行判断
各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表
2 取出列表②的表头C,进行判断
C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除
merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
3 进行下一次新的merge操作 ......
文章第一个图的计算方式为:
L 代表mro列表,(B,C)代表 [B] + [C]
python查看继承类的方法
class a:
def test(self):
print(1)
print(a.mro())
>>>
[<class '__main__.a'>, <class 'object'>]
规律总结
从当前查找类
的第一个待查找父类
一直向上查找,当遇到父类还有其他子类时,且子类也是当前查找类
的父类或父父类,则优先查找其子类,直到到达查找顶端Object类(跳过Object类),再查找下一个待查找父类
。重复至结束所有查找。