Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么';";m的一个称为;在本例中,是否打印两次?_Python_Python 3.x - Fatal编程技术网

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]