Python:类继承

Python:类继承,python,python-3.x,Python,Python 3.x,这两种情况有什么不同 # Error: Cannot create a consistent method resolution order (MRO) for bases A, B class A: pass class B(A): pass class C(A, B): pass # Current situation class A: pass class B(A): pass class C(B, A): pass 您的C继承自

这两种情况有什么不同

# Error: Cannot create a consistent method resolution order (MRO) for bases A, B
class A:
    pass

class B(A):
    pass

class C(A, B):
    pass

# Current situation
class A:
    pass

class B(A):
    pass

class C(B, A):
    pass

您的
C
继承自
B
A
。因为
B
已经继承了
A
Python现在无法确定首先查找方法的类;
A
,或在
B
上,这将覆盖
A
中定义的内容

您不需要在这里命名
B
的所有基类;仅从该类继承:

class C(B):
    pass
B
已包含
A
,无需再次包含它

更新区域:

注意:

要详细解释您的情况:

在查找实例属性/方法时,Python需要确定在基类中搜索(直接和间接)的顺序。它通过线性化继承图来实现这一点,也就是说,使用一种称为的算法,将基类图转换为一个序列。MRO算法是一种独特的算法,可实现多个理想特性:

  • 每个祖先类只出现一次
  • 类总是出现在其祖先之前(“单调性”)
  • 同一类的直接父类应按类定义中列出的顺序出现(“一致的本地优先顺序”)
  • 如果A类的子类总是出现在B类的子类之前,那么A应该出现在B类之前(“一致的扩展优先顺序”)
  • 对于代码,第二个约束要求首先出现
    B
    ;第三个约束要求首先出现
    A
    。由于无法满足所有约束,python报告您的继承层次结构是非法的

    这不仅仅是一个技术细节。在某些情况下(希望是罕见的),如果在多个类中定义了方法,您可能需要考虑应该使用哪个类来获取您调用的方法。定义基类的顺序会影响此选择

    希望这能帮助你理解和帮助你!:)
    谢谢

    答案应该是英语。好的,很抱歉。我想你已经在第一行代码中写了答案。你能告诉我一些细节或链接吗?但是为什么第二个答案是currect?谢谢你的帮助!你能告诉我更多关于单调性的事吗?我找不到任何答案。为什么继承的类应该是单调的。单调的意思是一个类可以被子类化而不影响其父类的优先顺序。有关更多详细信息和说明,请参阅或