这两种情况有什么不同?
# 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
答案 0 :(得分:2)
您的C
继承自B
和A
。因为B
已经从A
继承,所以Python现在无法确定首先查找方法的类; A
或B
上的A
,会覆盖B
中定义的内容。
您不需要在此处命名class C(B):
pass
的所有基类;只从这一个类继承:
B
A
已包含B
,您无需再次添加。
更新区域:
注意:强>
更详细地向您解释:
在查找实例属性/方法时,Python需要决定搜索(直接和间接)基类的顺序。它通过线性化继承图来实现,即通过使用名为C3 or MRO的算法将基类图转换为序列。 MRO算法是一种独特的算法,可以实现几个理想的属性:
使用您的代码,第二个约束要求首先显示A
;第三个约束要求 HttpCookie cookie = new HttpCookie(cookieName);
cookie.Expires = DateTime.Now.AddDays(1);
cookie.Values.Add(cookieName, string.Empty);
HttpContext.Response.Cookies.Add(cookie);
首先出现。由于无法满足所有约束,python会报告您的继承层次结构是非法的。
这不仅仅是技术细节。在某些(希望很少见)的情况下,如果在多个类中定义方法,您可能需要考虑应该使用哪个类来获取您调用的方法。您定义基类的顺序会影响此选择。
希望这有助于您了解并帮助您! :) 三江源!