简单地说是Python的
在类中查找属性名本质上是通过访问左向右、深度一阶中的祖先类来实现的。
然而,
>>> class A(object): x = 'a'
...
>>> class B(A): pass
...
>>> class C(A): x = 'c'
...
>>> class D(B, C): pass
...
>>> D.x
'c'
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>,
<class '__main__.A'>, <type 'object'>)D.__mro__列出的不是深度优先的类,而是广度优先的类。我是不是误解了什么?谢谢。
发布于 2017-11-05 02:27:02
忽略经典类,Python使用类及其父类的C3线性化解析方法和属性查找。在复杂的多继承层次结构中,C3线性化既不是深度优先,也不是广度优先。从某种意义上说,它是:
深度-首先,直到遇到将共享父级的类,然后是宽度-首先在这些类中。
虽然这是一个非常松散的特点。
但是,特别是在不共享父级的简单多继承层次结构中,它是深度优先(当然,它很方便地忽略了总是共享的object )。
简单示例-深度优先
>>> class a_0(object): pass
>>> class a_1(object): pass
>>> class b_0(a_0): pass
>>> class b_1(a_1): pass
>>> class c(b_0, b_1): pass然后
>>> [x.__name__ for x in c.__mro__]
['c', 'b_0', 'a_0', 'b_1', 'a_1', 'object']共享基础示例-深度然后是宽度
请注意,在您的示例中,您有一个共享父级(A),它使B和C首先以一种宽的方式遍历。如果您有一个越来越复杂的层次结构:
>>> class A(object): pass
>>> class B(A): pass
>>> class C(A): pass
>>> class D_0(B, C): pass
>>> class D_1(B, C): pass
>>> class E_0(D_0): pass
>>> class E_1(D_1): pass
>>> class F(E_0, E_1): pass然后
>>> [x.__name__ for x in F.__mro__]
['F', 'E_0', 'D_0', 'E_1', 'D_1', 'B', 'C', 'A', 'object']您将看到搜索是深度优先F, E_0, D_0,直到它到达遇到共享基类的点(B和C也是D_1的基),在这一点上,深度首先是指向E_1,然后再从那里返回深度。
https://stackoverflow.com/questions/47117327
复制相似问题