Python:类继承

时间:2018-03-07 07:04:17

标签: 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

1 个答案:

答案 0 :(得分:2)

您的C继承自BA。因为B已经从A继承,所以Python现在无法确定首先查找方法的类; AB上的A,会覆盖B中定义的内容。

您不需要在此处命名class C(B): pass 的所有基类;只从这一个类继承:

B

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

更新区域:

注意:

更详细地向您解释:

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

  1. 每个祖先类只出现一次
  2. 一个班总是出现在它的祖先(“单调性”)
  3. 之前
  4. 同一类的直接父类应按照类定义中列出的顺序出现(“一致的本地优先顺序”)
  5. 如果A类的孩子总是出现在B级的孩子面前,那么A应该出现在B之前(“一致的扩展优先顺序”)
  6. 使用您的代码,第二个约束要求首先显示A;第三个约束要求 HttpCookie cookie = new HttpCookie(cookieName); cookie.Expires = DateTime.Now.AddDays(1); cookie.Values.Add(cookieName, string.Empty); HttpContext.Response.Cookies.Add(cookie); 首先出现。由于无法满足所有约束,python会报告您的继承层次结构是非法的。

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

    希望这有助于您了解并帮助您! :) 三江源!