我试图理解python中的this piece of code。据我所知,super
用于在不想显式写入基类名称时从派生类调用基类函数。但正如下面提到的,如果基类本身使用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)
我尝试过创建一些类似于上面的示例类,但是我得到了预期的“没有这样的参数”异常。在
您会注意到您的类
ReviewCreateView
有两个基类(direct)。super
对于确保在这些基类的和上调用dispatch
方法是必需的。在无论何时创建一个类,python都会查看继承树并将其展平,从而创建一个称为"Method Resolution Order" (MRO)的东西。在这种情况下,您的MRO可能是1:
^{pr2}$super
所做的是检查当前MRO并调用MRO中下一个类上的方法。您的调用堆栈将如下所示:现在请注意,如果
ReviewViewMixin
中没有super
,则调用堆栈将以它结束。但是,由于它有一个super
,MRO中的下一个类是CreateView
,因此CreateView
的dispatch方法也将被调用。在super
要想真正地把你的头脑包围起来,我建议你阅读雷蒙德·海丁格(Raymond Hettinger)的"super is Super"文章,以获得一些想法和最佳实践。在1您可以使用^{} 或简单地查看
ReviewCreateView.__mro__
相关问题 更多 >
编程相关推荐