zoukankan      html  css  js  c++  java
  • python的MRO算法

    历史

    python2.1 经典类 DFS(深度优先遍历)
    python2.2 引入新式类,经典类 DFS,新式类 BFS(广度优先遍历)
    python2.3-2.7 经典类 DFS,新式类 C3
    python3 新式类 C3

    U型继承和菱形继承

    U型继承

    对于DFS算法,MRO(方法解析顺序)为:CAXBY,最终拿到X的hello方法,没有问题
    对于BFS算法,MRO为:CABXY,最终拿到B的hello方法,有问题

    菱形继承

    对于DFS算法,MRO(方法解析顺序)为:CAXB,最终拿到X的hello方法,有问题
    对于BFS算法,MRO为:CABX,最终拿到B的hello方法,没有问题

    C3线性化算法

    DFS和BFS都不能同时解决U型继承和菱形继承两种模式,如果想要解决,那就需要在现有算法基础上加以改造
    C3算法在DFS深度遍历基础上增加了一步:删除坏的节点

    什么是好的节点?什么是坏的节点?
    当搜索路径中N节点之后的节点都不继承N,则N节点为好的节点,否则为坏的节点
    比如对于菱形继承,DFS之后得到搜索路径为CAXBX,由于X节点被后面的B节点继承,X节点为坏的节点,所以删除X节点,得到MRO顺序为CABX

    区分搜索路径和MRO顺序:
    上面的MRO顺序是在搜索路径的基础上删除了重复节点,比如菱形继承DFS得到的搜索路径为CAXBX,删除X得到MRO为:CAXB

    总结

    C3算法在DFS基础上(DFS满足U型继承)做了扩展,从而同时解决了U型继承和菱形继承两个问题。

  • 相关阅读:
    面试-23种设计模式
    面试-类和对象的区别
    面试-链表和数组的区别
    Python强制抛出自定义异常
    Python中模拟C# Linq的一些操作
    python随机数seed用法
    Python目录常用操作
    Unity编辑器下获取动画的根运动状态并修改
    python字符串操作,以及对应的C#实现
    测试-一个unity的编译bug,初始化器
  • 原文地址:https://www.cnblogs.com/Peter2014/p/12411272.html
Copyright © 2011-2022 走看看