Python 使用super()函数的输出不明确
我试图获得下面包含super()函数的python代码的输出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
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()
会返回“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.不,为什么要这样?可能是重复的