gpt4 book ai didi

Python:类继承

转载 作者:行者123 更新时间:2023-12-01 02:05:11 28 4
gpt4 key购买 nike

这两种情况有什么不同?

# 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 中定义的内容。

您不需要在此处命名 B 的所有基类;只需从该类继承即可:

class C(B):
pass

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

更新区域:

注意:

更详细地向您解释:

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

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

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

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

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

关于Python:类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49146004/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com