Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这是一个模棱两可的MRO?_Python_Multiple Inheritance - Fatal编程技术网

Python 为什么这是一个模棱两可的MRO?

Python 为什么这是一个模棱两可的MRO?,python,multiple-inheritance,Python,Multiple Inheritance,为什么Python不能创建一致的MRO?在我看来,这很清楚: 如果第三个中不存在方法,则在第一个中搜索 如果第一个中不存在方法,则在第二个中搜索 但如果你尝试一下: TypeError:调用元类基时出错 无法创建一致的方法解析 第一个、第二个基地的订单(MRO) 为了“一致”,MRO应满足以下约束条件: 如果一个类从多个超类继承,那么它在超类列表中较早列出的超类在MRO中的出现时间应该早于它稍后列出的超类 MRO中的每个类都应该位于其任何超类之前 您建议的层次结构没有任何可能满足这些约束的顺序。

为什么Python不能创建一致的MRO?在我看来,这很清楚:

  • 如果第三个中不存在方法,则在第一个中搜索
  • 如果第一个中不存在方法,则在第二个中搜索
  • 但如果你尝试一下:

    TypeError:调用元类基时出错
    无法创建一致的方法解析
    第一个、第二个基地的订单(MRO)
    
    为了“一致”,MRO应满足以下约束条件:

  • 如果一个类从多个超类继承,那么它在超类列表中较早列出的超类在MRO中的出现时间应该早于它稍后列出的超类
  • MRO中的每个类都应该位于其任何超类之前
  • 您建议的层次结构没有任何可能满足这些约束的顺序。因为第三个定义为在第二个之前从第一个继承,所以在MRO中第一个应该在第二个之前。但由于Second继承自First,所以在MRO中Second应该位于First之前。这一矛盾无法调和


    您可以阅读更多关于Python用于计算MRO的精确方法的信息,如果我们应用C3线性化算法,该方法称为。

    i) 在第一张名单上占首位

    ii)如果该头部不在任何其他列表的尾部,则将其添加到C的线性化中,并将其从合并列表中删除

    iii)否则,请查看下一个列表的标题,如果它是一个好的标题,请接受它

    iv)然后重复该操作,直到移除所有类别或无法找到良好的头部

    是对象类吗

    L[第一]=第一个O

    第二个=第二个+合并(第一个,第一个)

    现在解L[秒]

    L[Second]=第二个+合并(第一个,第一个)

    首先是列表中的头,然后是列表中的头,所以这是一个好的头

    L[秒]=秒+第一+合并(O)

    O是名单上唯一的头,这是个好头

    L[秒]=秒+第一+O

    L[秒]=第二个第一个O

    L[Third]=第三+合并(L[First],L[Second],FirstSecond)

    现在解L[第三]

    L[Third]=第三+合并(FirstO,SecondFirstO,FirstSecond)

    L[Third]=第三+不可能找到好的头脑


    First是列表中的头FirstO但它是列表中的尾SecondFirstO,SecondFirstO是列表中的头SecondFirstO但它是列表中的尾FirstSecond,O是两个列表中的尾FirstO,SecondFirstO,所以不可能找到好的头。

    Python内部认为在子类之前不要有超类

    根据你的密码。在扫描或加载类之后,Python认为方法解析必须是:

    class First(object):
        def __init__(self):
            print("first")
    
    class Second(First):
        def __init__(self):
            print("second")
    
    class Third(First, Second):
        def __init__(self):
            print("third")
    
    这里,FirstSecond的超类

    但是在执行时,在检查第三个之后,它会遇到第一个,这是第二个的超类

    因此出现了打字错误

    Third -> Second -> First
    

    看看这个问题吧,这是一个必读的、精彩的解释。在阅读了目标的一致性之后,它现在变得更有意义了。
    class Third(First, Second): # Wrong
    class Third(Second, First): # Correct