Python从super或类中调用方法是有区别的

时间:2015-05-18 09:22:03

标签: python inheritance override

使用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)

这些方法之间有什么区别吗?出于任何原因,任何人都是首选吗?

2 个答案:

答案 0 :(得分:1)

如果我没有弄错,第二个例子会导致无限循环,因为它是一个没有任何停止标准的递归调用。

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

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

答案 1 :(得分:1)

除非您处理旧式类(这里不是这种情况),否则使用super()是RightThing(tm),因为super()将正确处理呼叫权利" next"根据继承图的方法 - 记住,Python确实支持多重继承(其中FWIW在Django的基于类的视图中被广泛使用)。