【问题标题】:When should I use the keyword super in Base class in python?我什么时候应该在 python 的基类中使用关键字 super?
【发布时间】:2016-12-01 05:24:43
【问题描述】:

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

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

【问题讨论】:

    标签: python django inheritance django-forms multiple-inheritance


    【解决方案1】:

    您会注意到您的类ReviewCreateView两个(直接)基类。 super 是确保 dispatch 方法在两个这些基类上被调用的必要条件。

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

    ReviewCreateView, ReviewViewMixin, CreateView, ..., object
    

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

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

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

    1您可以使用inspect.getmro(ReviewCreateView) 或直接查看ReviewCreateView.__mro__ 来检查MRO

    【讨论】:

    • 这绝对是一个简单而精彩的解释。非常感谢。我花了太多时间弄清楚发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2011-06-30
    • 2018-06-26
    • 2012-12-23
    相关资源
    最近更新 更多