Python从super或从类调用方法有区别吗
使用Django,我习惯于使用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
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()
。