Python 为什么';";m的一个称为;在本例中,是否打印两次?
我从以下方面得到: 以及输出:Python 为什么';";m的一个称为;在本例中,是否打印两次?,python,python-3.x,Python,Python 3.x,我从以下方面得到: 以及输出: >>> from super5 import D >>> x = D() >>> x.m() m of D called m of B called m of C called m of A called 我是一名编程初学者,我正在努力理解super()和MRO是如何工作的。抱歉,如果这是一个愚蠢的问题。super确保您遵循方法解析顺序。因此,如果每个类都包含一个(适当的)super,它将遵循您最初调用该方法
>>> from super5 import D
>>> x = D()
>>> x.m()
m of D called
m of B called
m of C called
m of A called
我是一名编程初学者,我正在努力理解super()和MRO是如何工作的。抱歉,如果这是一个愚蠢的问题。
super
确保您遵循方法解析顺序。因此,如果每个类都包含一个(适当的)super
,它将遵循您最初调用该方法的类的MRO
在您的案例中,它是D
的一个实例,D
的MRO是:
>>> D.mro()
[D, B, C, A, object]
因此它将首先使用调用super的D.m
,然后调用super的B.m
,然后调用super的C.m
,使用super的A.m
。但是在这里它停止了,因为A
不使用super
,所以它不会尝试调用object.m
由于A
在MRO中不存在两次(不确定是否可能),因此没有理由期望它被调用两次。如果您只使用super
s,至少不会
如果您想知道MRO是如何创建的,那么有一个解决方案。简言之:在调用父级之前会调用同级(具有相同父级的子类),但仅仅因为父级有多个子级并不意味着它会被调用多次。因为这就是
super
的目的,以帮助确保MRO中的所有实现都被调用一次。
>>> D.mro()
[D, B, C, A, object]