0

我想了解python中的this piece of code。根据我的理解,当您不想显式编写基类的名称时,super用于从派生类调用基类函数。但是如下所述,如果基类本身使用super来调用某个函数,这意味着什么?什么时候应该在python的Base类中使用关键字super?

class ReviewViewMixin(object): 
    def dispatch(self, request, *args, **kwargs): 
     # some code 
     return super(ReviewViewMixin, self).dispatch(request, *args, **kwargs) 


class ReviewCreateView(ReviewViewMixin, CreateView): 
    # some code 
    def dispatch(self, request, *args, **kwargs): 
     super(ReviewCreateView, self).dispatch(request, *args, **kwargs) 

我试着创建类似上面的几个样本类,但我得到了预期的“没有这样的参数”异常。

回答

3

你会注意到你的类ReviewCreateView两个(直接)基类。 super对于确保dispatch方法在这两个基类的被调用是必要的。

每当创建一个类时,python会查看继承树并将其展平,从而创建一个名为"Method Resolution Order" (MRO)的东西。在这种情况下,您的MRO可能是:

ReviewCreateView, ReviewViewMixin, CreateView, ..., object 

什么super所做的就是检查当前的MRO,并呼吁在MRO的下一个类中的方法。您调用堆栈将类似于:

ReviewCreateView.dispatch (super) -> ReviewViewMixin.dispatch (super) -> CreateView.dispatch 

现在注意,如果ReviewViewMixin没有在那里super,调用堆栈会用它结束。但是,由于它具有super,并且MRO中的下一个类是CreateView,CreateView的调度方法也将被调用。

super可能会非常棘手以真正包裹你的头 - 我建议阅读Raymond Hettinger的文章"super is Super",以获得一些想法和最佳实践。

您可以通过使用inspect.getmro(ReviewCreateView),还是仅仅在ReviewCreateView.__mro__

+0

这是绝对简单和灿烂的解释检查维修。非常感谢。我花了太多时间来弄清楚发生了什么事。 – Sathish

相关问题