Python 如何判断超级()MRO的下一个顺序是什么?
我如何知道super在MRO中将采用哪条路径?super Python中super的主要用途是在派生类中调用重写的基类方法,就像其他语言中的super一样。 这通常是为了使派生类方法可以通过在其自身代码之前或之后调用基类来扩充基类,而不是完全替换它Python 如何判断超级()MRO的下一个顺序是什么?,python,python-3.x,python-3.5,super,Python,Python 3.x,Python 3.5,Super,我如何知道super在MRO中将采用哪条路径?super Python中super的主要用途是在派生类中调用重写的基类方法,就像其他语言中的super一样。 这通常是为了使派生类方法可以通过在其自身代码之前或之后调用基类来扩充基类,而不是完全替换它 class Derived(Base): def method(self, arg): # Maybe do something here super(Derived, self).method(arg)
class Derived(Base):
def method(self, arg):
# Maybe do something here
super(Derived, self).method(arg)
# Could so something here as well
超级函数实际上是通过返回代理类的对象来工作的,该代理类将调用委托给父类。
在这种情况下使用super的优点是,您不需要显式地命名基类,这有助于提高可维护性
超级函数还可以用于更复杂的多重继承情况,在这种情况下,它可以执行诸如委托给姐妹类之类的操作
这是两个伟大的资源,应该回答你的所有问题
简而言之,super使用标准的方法解析顺序MRO来查找您要求的方法。请看这张图片:
E继承自C和D。C继承自A,A继承自对象。D从B继承,B从对象继承。红色箭头显示super在搜索中使用的MRO
请注意,super不引用父类。即使A继承自对象而不是D,但在MRO中D是下一个。因此,为了回答您的问题,接下来的一行是指MRO。在Python 3中,您可以使用super.some\u方法进行单一继承。不需要显式绑定红色箭头是我不理解的。为什么从e到c,而不是从e到d等等。?因为e同时从c和d继承,我怎么知道super在MRO中要走的路线?换句话说,为什么c优先于d?然后从C到A,在我看来,它应该先到C或D,在你的图表中,它先到C,但没有找到它需要的东西,我认为它应该先到D,然后再到A或B。这个问题不应该被关闭。标记为重复的问题的已接受答案不回答此问题。这个问题的答案是用ClassName查找。