zoukankan      html  css  js  c++  java
  • (转)pythonC3线性算法

    本文转自:http://kaiyuan.me/2016/04/27/C3_linearization/

    作者:Kaiyuan

    注意:本文仅仅作为个人mark,所以排版并不如原文,另本文在原文基础上做了一些修改,但由于本人技术实力尚浅,所作修改可能会误导读者,建议到原文查看。

    在介绍算法之前,我们首先约定需要使用的符号。我们用 CC2CN 表示包含 N 个类的列表,并令

    head(CC2CN)=C1

    tail(CC2CN)=CC3CN

    为了方便做列表连接操作,我们记:

    C1+(CC3CN)=CC2CN

    假设类 C 继承自父类 B1,,BN那么根据 C3 线性化,类 C 的方法解析列表通过如下公式确定:

    L[C(B1BN)]=C+merge(L[B1],,L[BN],B1BN)

    这个公式表明 C 的解析列表是通过对其所有父类的解析列表及其父类一起做 merge 操作所得到。

    接下来我们介绍 C3 线性化中最重要的操作 merge,该操作可以分为以下几个步骤:

    1. 选取 merge中的第一个列表记为当前列表 K
    2. 令 h=head(K),如果 h 没有出现在其他任何列表的 tail 当中,那么将其加入到类 C 的线性化列表中,并将其从 merge 中所有列表中移除,之后重复步骤 1和2
    3. 否则,设置 K 为 merge 中的下一个列表,并重复 2 中的操作。
    4. 如果 merge中所有的类都被移除,则输出类创建成功;如果不能找到下一个 h,则输出拒绝创建类 C 并抛出异常。

    上面的过程看起来好像很复杂,我们用一个例子来具体执行一下,你就会觉得其实还是挺简单的。假设我们有如下的一个类继承关系:

    class A(object):
    
        def __init__(self):
            print("enter A")
            super(A, self).__init__()
            print("leave A")
    
    
    class B(object):
    
        def __init__(self):
            print("enter B")
            super(B, self).__init__()
            print("leave B")
    
    
    class C(object):
    
        def __init__(self):
            print("enter C")
            super(C, self).__init__()
            print("leave C")
    
    
    class D(A):
    
        def __init__(self):
            print("enter D")
            super(D, self).__init__()
            print("leave D")
    
    
    class E(A, C):
    
        def __init__(self):
            print("enter E")
            super(E, self).__init__()
            print("leave E")
    
    
    class F(D, B):
    
        def __init__(self):
            print("enter F")
            super(F, self).__init__()
            print("leave F")
    
    
    class G(E, F):
    
        def __init__(self):
            print("enter G")
            super(G, self).__init__()
            print("leave G")
    
    """
    l[F(D, B)] = F + merge(l(D), l(B), DB)
                 F + merge([D, A], B, [D, B])
                 [F, D, A, B]
    l[G(E, F)] = G + merge(l(E), l(F), EF)
                 G + merge([E, A, C], [F, D, A, B], [E, F])
                 [G, E, F, D, A, C, B]
    
    """
    
    print(G.mro())
  • 相关阅读:
    Hibernate的注释该如何使用?每一个注释代表什么意思?
    J2SE总结(一)-------容器
    解决hibernate向mysql插入中文乱码问题(更改MySQL字符集)
    android程序员成长路径的思考
    Fragment总结
    onCreateView的一个细节--Fragment
    屏幕适配
    表驱动法3
    表驱动法2
    表驱动法1
  • 原文地址:https://www.cnblogs.com/MnCu8261/p/9696583.html
Copyright © 2011-2022 走看看