gpt4 book ai didi

python - 方法解析顺序 MRO

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:28 25 4
gpt4 key购买 nike

为什么搜索完B之后不去更深的搜索Y OR z而是去搜索A呢?

Y 是 A 的父级,如果应该先搜索 A,但是 Y 是 B 的父级所以它应该先搜索 Y,为什么这不会抛出 MRO 错误?

谁能解释一下这个查找是如何工作的?

class X(object):pass
class Y(object): pass
class Z(object): pass
class A(X,Y): pass
class B(Y,Z):pass
class M(B,A,Z):pass
print M.__mro__

给予

(<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <type 'object'>)

enter image description here

最佳答案

在您的具体示例中,在搜索 B 之后,我们不能立即考虑 Y,因为它是 A 的子级。我们不能立即考虑 Z,因为 M 继承自 A before 它继承自 Z.


Python使用C3方法解析顺序details here .

C3解析顺序很好的解决了菱形继承问题

在下面的示例中,我们有一个非常通用的类 Object,它是 BC 的父类(super class)。如果既不是 B 也不是 C,我们只希望考虑 Object 中的方法实现(例如 __repr__ 或其他)有实现。

         Object
/ \
B C
\ /
A

换句话说,A 的父类的传递闭包中的每个可能的父类都会被考虑,但是这些类是根据来自的“最新”路径排序的相关类的基类。

对象有两条路径:

A -> B -> Object
A -> C -> Object

“最新”路径是 A -> C -> Object 因为 A -> B -> Object 在左偏深度优先搜索中会更早.

C3 线性化满足两个关键不变量:

  • 如果 X 继承自 Y,则在 Y 之前检查 X
  • 如果 Z 继承自 U 然后 V 按此顺序UV 之前检查。

事实上 C3 线性化保证了这两个属性都成立。

可以构建无法线性化的层次结构,在这种情况下,您会在类定义时遇到异常。

运行 inherit.py

class E: pass      
class F: pass
class A(E, F): pass
class B(F, E): pass
class Z(A, B): pass

产生以下错误。

Traceback (most recent call last):
File "inherit.py", line 5, in <module>
class Z(A, B): pass
TypeError: Cannot create a consistent method resolution
order (MRO) for bases E, F

关于python - 方法解析顺序 MRO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692832/

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