为什么当一个子class does/doesnt 继承Python 中的第三个class 时,这个class 的MRO 会发生变化?
Why does the MRO of this class change when one subclass does/doesnt inherit a third class in Python?
我试图在 Python 中更好地了解 MRO,并遇到了这个例子:
class A:
def process(self):
print('A process()')
class B(A):
pass
class C(A):
def process(self):
print('C process()')
class D(B,C):
pass
obj = D()
obj.process()
打印“C process()”。我明白为什么,因为顺序是 D>B>C>A。但是,当 class C 不继承 A 时,将打印“A process()”,顺序变为 D>B>A>C。是什么导致订单转移到这里?为什么 C superclass 现在没有在 A class 之前达到?
C3 线性化算法有点深度优先,因此 A
,可以从 B
到达(它在基础 class 列表中的 C
之前列出)在 C
.
之前添加
理由是 D
比“C 类”更“类 B”,因此属于“B”的任何内容都应出现在“C”之前。
(为了好玩,看看当 C
仍然继承自 A
时尝试 class D(B, A, C)
会发生什么。)
我试图在 Python 中更好地了解 MRO,并遇到了这个例子:
class A:
def process(self):
print('A process()')
class B(A):
pass
class C(A):
def process(self):
print('C process()')
class D(B,C):
pass
obj = D()
obj.process()
打印“C process()”。我明白为什么,因为顺序是 D>B>C>A。但是,当 class C 不继承 A 时,将打印“A process()”,顺序变为 D>B>A>C。是什么导致订单转移到这里?为什么 C superclass 现在没有在 A class 之前达到?
C3 线性化算法有点深度优先,因此 A
,可以从 B
到达(它在基础 class 列表中的 C
之前列出)在 C
.
理由是 D
比“C 类”更“类 B”,因此属于“B”的任何内容都应出现在“C”之前。
(为了好玩,看看当 C
仍然继承自 A
时尝试 class D(B, A, C)
会发生什么。)