刘刚刚的个人博客

python-MRO列表及C3算法


当一个类继承多个类时,通过MRO列表来查找其属性或者方法。

概述

image-20200926224118325

在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]

image-20200926224919565

规律总结

当前查找类第一个待查找父类一直向上查找,当遇到父类还有其他子类时,且子类也是当前查找类的父类或父父类,则优先查找其子类,直到到达查找顶端Object类(跳过Object类),再查找下一个待查找父类。重复至结束所有查找。

我的名片

昵称:shuta

职业:后台开发(php)

邮箱:648949076@qq.com

站点信息

建站时间: 2020/2/19
网站程序: ANTD PRO VUE + TP6.0
晋ICP备18007778号