mixin类中super()到底继承谁的方法?

2019-08-16  本文已影响0人  warmsirius

写在前面

参考博客

回到 LoginRequiredMixin 例子中来

涉及到的三个类

from django.contrib.auth.decorators import login_required

# LoginRequiredMixin 类
class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls, **initkwargs):
        # 调用父类的as_view
        view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
        return login_required(view)


# View类
class View:
    ...

    @classonlymethod
    def as_view(cls, **initkwargs):
        """Main entry point for a request-response process."""
        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError("You tried to pass in the %s method name as a "
                                "keyword argument to %s(). Don't do that."
                                % (key, cls.__name__))
            if not hasattr(cls, key):
                raise TypeError("%s() received an invalid keyword %r. as_view "
                                "only accepts arguments that are already "
                                "attributes of the class." % (cls.__name__, key))
        ...


# UserInfoView类
class UserInfoView(LoginRequiredMixin, View):
    '''用户中心-信息页'''
    def get(self, request):
        '''显示'''
        # page = 'user'
        return render(request, 'df_user/user_center_info.html', {'page': 'user'})

提出问题

从上面可以看出,我们的 LoginRequiredMixin 继承的是object,但是object并没有as_view()方法,那么 LoginRequiredMixin 究竟调用了谁的as_view 方法呢?

问题解释

在多继承的环境下,super() 有相对来说更加复杂的含义。它会查看你的继承链,使用一种叫做 Methods Resolution Order(方法解析顺序) 的方式,来决定调用最近的继承父类的方法。

LoginRequiredMixin.as_view()的调用行为:

LoginRequiredMixin调用解释

总结

上一篇 下一篇

猜你喜欢

热点阅读