Python 2.6打印根因为Root
是一个旧式的类。如果Root
继承自object
(使其成为新风格的类),则应打印B
。
旧式课程并未使用C3 MRO,而是旧式的有缺陷的MRO,这正是您引用的文本所描述的内容。
B在Root之前出现的原因是因为B也从Root继承。
AB的继承图是:
AB - A - Root -- object
\ /
B
所以:
mro(object) = [object]
mro(Root) = [Root] + mro(object) # mro of single-inherited class is simple...
= [Root, object]
mro(A) = [A, Root, object]
mro(B) = [B, Root, object]
在多重继承的情况下,MRO是通过采取超类的活性氧代谢的元素从左至右计算,这并不出现在中间。在例子中更好地解释:
mro(AB) = [AB] + merge(mro(A), mro(B))
= [AB] + merge([A, Root, object], [B, Root, object])
= [AB] + [A] + merge([Root, object], [B, Root, object])
# A appears at head, pop it.
= [AB] + [A] + [B] + merge([Root, object], [Root, object])
# cannot pop Root because Root is not at head of [B, Root, object]
# pop B instead.
= [AB] + [A] + [B] + [Root] + merge([object], [object])
# now we can pop Root because it only appears at the head position
= [AB] + [A] + [B] + [Root] + [object]
= [AB, A, B, Root, object]
更多详细信息请参见http://www.python.org/download/releases/2.3/mro/。
因此,文档解释“搜索从父类继承的属性为深度优先,从左到右,而不是在同一类中存在层次结构重叠的地方进行两次搜索”并不是很好,我应该忽略它吗? – max 2010-09-03 17:23:26
@max:“在最简单的情况下”是好的。你的例子并不是最简单的。 – kennytm 2010-09-03 17:36:23