我什么时候应该在python的基类中使用关键字super?

2024-05-01 22:08:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解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)

我尝试过创建一些类似于上面的示例类,但是我得到了预期的“没有这样的参数”异常。在


Tags: 函数selfrequestdefargscodesomethis
1条回答
网友
1楼 · 发布于 2024-05-01 22:08:46

您会注意到您的类ReviewCreateView有两个基类(direct)。super对于确保在这些基类的上调用dispatch方法是必需的。在

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

ReviewCreateView, ReviewViewMixin, CreateView, ..., object

super所做的是检查当前MRO并调用MRO中下一个类上的方法。您的调用堆栈将如下所示:

^{pr2}$

现在请注意,如果ReviewViewMixin中没有super,则调用堆栈将以它结束。但是,由于它有一个super,MRO中的下一个类是CreateView,因此CreateView的dispatch方法也将被调用。在

super要想真正地把你的头脑包围起来,我建议你阅读雷蒙德·海丁格(Raymond Hettinger)的"super is Super"文章,以获得一些想法和最佳实践。在

1您可以使用^{}或简单地查看ReviewCreateView.__mro__

相关问题 更多 >