Python 为什么这是一个模棱两可的MRO?
为什么Python不能创建一致的MRO?在我看来,这很清楚:Python 为什么这是一个模棱两可的MRO?,python,multiple-inheritance,Python,Multiple Inheritance,为什么Python不能创建一致的MRO?在我看来,这很清楚: 如果第三个中不存在方法,则在第一个中搜索 如果第一个中不存在方法,则在第二个中搜索 但如果你尝试一下: TypeError:调用元类基时出错 无法创建一致的方法解析 第一个、第二个基地的订单(MRO) 为了“一致”,MRO应满足以下约束条件: 如果一个类从多个超类继承,那么它在超类列表中较早列出的超类在MRO中的出现时间应该早于它稍后列出的超类 MRO中的每个类都应该位于其任何超类之前 您建议的层次结构没有任何可能满足这些约束的顺序。
TypeError:调用元类基时出错
无法创建一致的方法解析
第一个、第二个基地的订单(MRO)
为了“一致”,MRO应满足以下约束条件:
您可以阅读更多关于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")
这里,First是Second的超类
但是在执行时,在检查第三个之后,它会遇到第一个,这是第二个的超类
因此出现了打字错误
Third -> Second -> First
看看这个问题吧,这是一个必读的、精彩的解释。在阅读了目标的一致性之后,它现在变得更有意义了。
class Third(First, Second): # Wrong
class Third(Second, First): # Correct