python - 为什么基类在这种多重继承中不起作用?
问题描述
我对解释以下代码的 MRO 和 C3 线性化算法感到困惑,请您帮帮我吗?
class A(object):
def go(self):
print("A")
class B(A):
def go(self):
super(B, self).go()
print("B")
class C(A):
def go(self):
# super(C, self).go()
print("C")
class D(B, C):
def go(self):
super(D, self).go()
print("D")
d = D()
d.go()
pprint.pprint(D.__mro__)
The Result is:
C
B
D
(<class '__main__.D'>,
<class '__main__.B'>,
<class '__main__.C'>,
<class '__main__.A'>,
<class 'object'>)
再比如:如果我在C类中取消注释super语句,在B类中注释super语句,结果会是“B D”,没有C和A。为什么?!!!!!!(我确实理解深度优先,从左到右的规则,但是……)
解决方案
该super()
方法只是根据 MRO 找到要调用的下一个方法。
D.go()
调用B.go()
,然后调用C.go()
,它打印C
并返回到B.go()
哪个打印B
,最后返回到D.go()
哪个打印D
如果您希望go()
调用所有方法,则必须取消注释中的super()
调用C.go()
。
super()
您可以在Guido 自己的博客中找到更多关于 MRO 的信息并致电
推荐阅读
- python - Django模型删除方法不覆盖
- expo - 在你的 webpack 配置中为包命名: react native web maps ;反应原生地图
- node.js - git 操作成功触发,但网站未呈现更新
- c++ - 如何知道进程正在使用哪个处理器?
- makefile - 来自 Cmake 的 Makefile 没有放置实际的编译器,而是放置了 'ftn',它用作 CMAKE_Fortran_COMPILER 的变量
- python - 在Python中以升序将值插入字典?
- javascript - 根据工作流输入值过滤列表视图
- arrays - 使用 Numpy Arrays Python 进行索引和数学计算
- php - 当通过引用传递var时,PHP解析错误语法错误
- c - 我想了解 C 库配置