繁体   English   中英

Python:类继承

[英]Python: Class inherit

两种情况有何不同?

# 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继承自BA 因为B已经从A继承了,所以Python现在无法确定首先查找哪个类的方法。 AB ,它将覆盖A定义A

您无需在此处命名B所有基类; 只是从该类继承:

class C(B):
    pass

B已经包含A ,您无需再次包含它。

更新区域:

注意:

为您详细说明:

在查找实例属性/方法时,Python需要确定以哪种顺序搜索(直接和间接)基类。 它通过使用C3或MRO算法将继承图线性化(即通过将基类的图转换为序列)来实现此目的。 MRO算法是一种独特的算法,可以实现几个理想的属性:

  1. 每个祖先类只出现一次
  2. 一个类总是出现在其祖先之前(“单调性”)
  3. 同一类的直接父级应该以与类定义中列出的顺序相同的顺序出现(“一致的本地优先顺序”)
  4. 如果A类的子代总是出现在B类的子代之前,则A应该出现在B子之前(“一致的扩展优先顺序”)

对于您的代码,第二个约束要求B首先出现; 第三个约束条件要求A首先出现。 由于无法满足所有约束,因此python报告您的继承层次结构是非法的。

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

希望这可以帮助您理解并帮助您! :) 谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM