zoukankan      html  css  js  c++  java
  • python之路--MRO和C3算法

    一 . MRO(method resolution order) 

      多继承的一种方法,一种查找的顺序

      在python3 里面是一种新类式MRO 需要用都的是C3算法

    class A:
        pass
    class B(A):
        pass
    class C(A):
        pass
    class D(B, C):
        pass
    class E(C, A):
        pass
    class F(D, E):
        pass
    class G(E):
        pass
    class H(G, F):
        pass
    首先. 我们要确定从H开始找. 也就是说. 创建的是H的对象.
    如果从H找. 那找到H+H的父类的C3, 我们设C3算法是L(x) , 即给出x类. 找到x的MRO.

      L(H) = H + L(G) + L(F) + GF
      继续从代码中找G和F的⽗类往⾥⾯带
      L(G) = G + L(E) + E
      L(F) = F + L(D)+ L(E) + DE
      继续找E 和 D
      L(E) = E + L(C) + L(A) + CA
      L(D) = D + L(B) + L(C) + BC
      继续找B和C
      L(B) = B + L(A) + A
      L(C) = C + L(A) + A

     

    最后就剩下⼀个A了. 也就不⽤再找了. 接下来. 把L(A) 往⾥带. 再推回去. 但要记住. 
      这⾥的 + 表⽰的是merge. merge的原则是⽤每个元组的头⼀项和后⾯元组的除头⼀项外的其他元素进⾏比较, 看是否存在.
        如果存在. 就从下⼀个元组的头⼀项继续找. 如果找不到. 就拿出来.作为merge的结果的⼀项. 以此类推. 直到元组之间的元素都相同. 也就不⽤再找了.

      L(B) =(B,) + (A,) + (A) -> (B, A)
      L(C) =(C,) + (A,) + (A) -> (C, A)
      继续带.
      L(E) = (E,) + (C, A) + (A) + (C,A) -> E, C, A
      L(D) = (D,) + (B, A) + (C, A) + (B, C) -> D, B, C, A

      继续带.
      L(G) = (G,) + (E, C, A) + (E) -> G, E, C, A
      L(F) = (F,) + (D, B, C, A) + (E, C, A) + (D, E)-> F, D, B, E, C, A
      加油, 最后了
      L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) + (G, F) -> H, G, F, D, B, E, C, A

    算完了. 最终结果 HGFDBECA. 那这个算完了. 如何验证呢? 其实python早就给你准备好了. 我们可以使⽤类名.__mro__获取到类的MRO信息.
    print(H.__mro__)
    结果: 
    (<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class
    '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class
    '__main__.C'>,<class '__main__

      

  • 相关阅读:
    kernel pwn 入门环境搭建
    linux下sh脚本/bin/bash^M问题解决
    Linux下的C#连接Mysql数据库
    使用docker Hub
    使用ajax+php+mysql实现数据库定时刷新
    docker 安装LAMP环境
    解决Mysql错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
    php实现socket简单的例子
    一次mysql调优过程
    一次mysql主从同步问题及解决过程
  • 原文地址:https://www.cnblogs.com/attila/p/10169055.html
Copyright © 2011-2022 走看看