有人可以解释我在这里发生的电话堆栈吗?它叫D,B,C,A。你可以提供它是如何发生的

时间:2018-06-17 20:39:57

标签: python python-3.x

我对super.I的概念不熟悉我无法理解此代码中每个类的m方法所做的调用堆栈

class A:
    def m(self):
        print("m of A called")
        print("OUT OF A")

class B(A):
    def m(self):
        print("m of B called")
        super().m()
        print("OUT OF B")

class C(A):
    def m(self):
        print("m of C called")
        super().m()
        print("OUT OF C")

class D(B,C):
    def m(self):
        print("m of D called")
        super().m()
        print("OUT OF D")

x = D()
x.m()

以下输出为:

m of D called
m of B called
m of C called
m of A called
OUT OF A
OUT OF C
OUT OF B
OUT OF D

如何从D调用B.()和C.()只调用A.m()一次

1 个答案:

答案 0 :(得分:0)

可以在此处找到解释:https://docs.python.org/3.6/library/functions.html#super

基本上你得到的是超类或兄弟(具有多重继承)

来自链接:

  

第二个用例是支持合作多重继承   动态执行环境。这个用例是Python和Python独有的   在静态编译的语言或语言中找不到   支持单继承。这使得实现成为可能   “菱形图”,其中多个基类实现相同的   方法。好的设计要求此方法具有相同的调用   在每种情况下签名(因为呼叫的顺序是在   运行时,因为该顺序适应类层次结构中的更改,   并且因为该顺序可以包括未知的兄弟类   在运行之前)。