Python 使用super()函数的输出不明确

Python 使用super()函数的输出不明确,python,Python,我试图获得下面包含super()函数的python代码的输出 class A(object): def go(self): print("go A go!") def stop(self): print("stop A stop!") def pause(self): raise Exception("Not Implemented") class B(A): def go(self): super

我试图获得下面包含super()函数的python代码的输出

class A(object):
    def go(self):
        print("go A go!")
    def stop(self):
        print("stop A stop!")
    def pause(self):
        raise Exception("Not Implemented")

class B(A):
    def go(self):
        super(B, self).go()
        print("go B go!")

class C(A):
    def go(self):
        super(C, self).go()
        print("go C go!")
    def stop(self):
        super(C, self).stop()
        print("stop C stop!")

class D(B,C):
    def go(self):
        super(D, self).go()
        print("go D go!")
    def stop(self):
        super(D, self).stop()
        print("stop D stop!")
    def pause(self):
        print("wait D wait!")
class E(B,C): pass

a = A()
b = B()
c = C()
d = D()
e = E()


#Find output of below function calls
d.go()
b.stop()
我的问题是:

  • 为什么
    d.go()
    的输出是:

    go A go!
    go C go!
    go B go!
    go D go!
    
    当类B和C都在使用super()函数调用基类A的方法go时,输出中不应该有一个额外的“go A go!”吗

  • 既然类B中没有stop()函数,那么为什么
    B.stop()
    会返回“stop A stop!”而不是引发错误呢


  • Python中的
    super
    不会按顺序给出每个子类中所有祖先的“直线”结果

    相反,当涉及到多重继承时,“做正确的事情”是非常好的,而“做正确的事情”的一个基本部分恰恰是避免在一个超类中的方法被多次调用

    因此,首先,每当您在Python中创建一个类时,该类都会获得一个
    \uuumro\uuuu
    属性(方法解析顺序)。第一个类总是类本身,最后一个类总是
    object

    super()
    将按照类在
    中出现的顺序搜索类,以检索属性、方法或超类属性或方法

    您将发现,根据这些规则,您对类D的MRO是
    (D,B,C,A,object)
    ,也就是说,如果方法的原始调用是在
    D
    对象中,当
    super
    B
    中的方法实现中遇到时,它将调用
    C
    实现,因为C是D的下一个类。上面链接的文件有这样的理由和更多的例子,但TL;DR:如果所有涉及的方法都以协作方式使用
    super
    ,则这确保每个上游类都有机会至少调用一次

    至于

    既然类B中没有stop()函数,那么为什么B.stop()是 返回“stop A stop!”而不是引发错误


    这是一种基本的继承,不需要了解Python的
    super
    的细节:如果在子类中未重写超类方法,则使用超类方法。

    1。否,
    super
    的全部要点是确保每个超类方法调用一次。2.因为它是从A继承的实现,正如输出非常清楚的那样?2。B从A继承,因此由于继承,它将有一个停止方法。1。不,不应该,看。2.不,为什么要这样?可能是重复的