Python从super或从类调用方法有区别吗

Python从super或从类调用方法有区别吗,python,inheritance,overriding,Python,Inheritance,Overriding,使用Django,我习惯于使用super覆盖泛型视图中的方法: class MyClass(SomeGenericView): def method_to_override(self, request, *args, **kwargs): # do something extra here return super(MyClass, self).method_to_override(request, *args, **kwargs) 我注意到py

使用Django,我习惯于使用super覆盖泛型视图中的方法:

class MyClass(SomeGenericView):

    def method_to_override(self, request, *args, **kwargs):
        # do something extra here  

        return super(MyClass, self).method_to_override(request, *args, **kwargs)
我注意到pydev会自动完成从父类调用方法:

class MyClass(SomeGenericView):

    def method_to_override(self, request, *args, **kwargs):
        # do something extra here  

        return SomeGenericView.method_to_override(self, request, *args, **kwargs)

这些方法之间有什么区别吗?是否出于任何原因首选任何一个?

如果我没有弄错的话,第二个示例将导致无限循环,因为它是一个没有任何停止条件的递归调用

我认为它应该替换为父类的名称,但即使这样,当您子类
MyClass
时也会有一些差异


在第一个示例中,子类将在父类
MyClass
中调用该方法,而在第二个示例中,它将在
SomeGenericView
中调用该方法,因为它是硬编码的。

除非您处理的是旧式类(这里不是这种情况),否则使用
super()
是正确的做法(tm),由于
super()
将根据继承图正确地调用正确的“next”方法,请记住,Python确实支持多重继承(FWIW在Django基于类的视图中广泛使用)

是的,你说得对,我打错了。我现在更新了这个问题。好吧,我的答案是正确的。这两种方法都是相同的,除非您是MyClass的子类。如果您将其子类化,通常会优先使用
super
,但这取决于子类化时的预期行为。您总是希望调用SomeGenericView方法,就像第二个示例中的情况一样,还是希望调用父类中的方法,就像第一个示例中的情况一样。在第一个例子中,子类将调用MyClass中的方法,即父类,“这没有多大意义。”。它调用父类上的方法,父类在某个GenericView中,实际上是相同的,这就是我问这个问题的原因。是的,有人向我指出了这一点,我已经更新了这个问题。@wobbily\u col:相应地编辑了我的答案。答案是一样的:除非您必须处理依赖旧式类的遗留代码,否则请始终使用
super()