使用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)
这些方法之间有什么区别吗?出于任何原因,任何人都是首选吗?
答案 0 :(得分:1)
如果我没有弄错,第二个例子会导致无限循环,因为它是一个没有任何停止标准的递归调用。
我认为它应该替换为父类的名称,但即使这样,当你继承MyClass
时也会有一些差异。
在第一个示例中,子类将调用MyClass
中的方法(父节点),而在第二个节点中,它将调用SomeGenericView
中的方法,因为它是硬编码的。
答案 1 :(得分:1)
除非您处理旧式类(这里不是这种情况),否则使用super()
是RightThing(tm),因为super()
将正确处理呼叫权利" next"根据继承图的方法 - 记住,Python确实支持多重继承(其中FWIW在Django的基于类的视图中被广泛使用)。