首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于ModelAdmin的混合问题

关于ModelAdmin的混合问题
EN

Stack Overflow用户
提问于 2011-05-20 10:11:08
回答 1查看 4.5K关注 0票数 5

因此,我正在重写一个ModelAdmin方法:

代码语言:javascript
复制
def response_change(self, request, obj):
    # alter redirect location if 'source' is found in GET
    response = super(JobOptions, self).response_change(request, obj)
    source = request.GET.get('source', None)
    if source:
        response['location'] = source
    return response

我不想在每一款车上重复这件事,我想把它做成一个混音。

如果我这样做了:

代码语言:javascript
复制
def RedirectMixin(admin.ModelAdmin)

然后:

代码语言:javascript
复制
def MyModel(admin.ModelAdmin, RedirectMixin)

然后我得到一个MRO错误。

但是,如果RedirectMixin不从admin.ModelAdmin继承,那么该方法就不会被调用。

另一个问题是如何泛化super()调用,使其不需要硬编码的超类。

EN

回答 1

Stack Overflow用户

发布于 2011-05-20 10:35:51

首先,我想在你的例子中,你指的是class而不是def

无论如何,正确的使用Mixin的方法是在要继承的类列表中首先使用它。所以:

代码语言:javascript
复制
class RedirectMixin(object):

代码语言:javascript
复制
class MyModelAdmin(RedirectMixin, admin.ModelAdmin):

这是因为Python按照声明的顺序查找所有父类,并调用它找到的第一个方法。

至于超级,这根本不应该提到超类--这就是它的全部意义。它应该引用当前类:

代码语言:javascript
复制
return super(MyModelAdmin, self).__init__(self, *args, **kwargs)

或者别的什么。

编辑在注释是的之后,混音应该在super调用中引用它自己的类。请考虑以下几点:

代码语言:javascript
复制
In [1]: class BaseClass(object):
   ...:     def my_function(self):
   ...:         print 'base my_function'
   ...:     

In [2]: class Mixin(object):
   ...:     def my_function(self):
   ...:         print 'mixin my_function'
   ...:         super(Mixin, self).my_function()
   ...: 

In [3]: class MyDerivedClass(Mixin, BaseClass):
   ...:     pass
   ...: 

现在,如果实例化子类并调用它的my_function方法,那么MRO将如您所期望的那样发生,即使Mixin没有从BaseClass继承:

代码语言:javascript
复制
In [4]: m=MyDerivedClass()

In [5]: m.my_function()
mixin my_function
base my_function

如果您不能使Mixin成为object的后代,则会出现您提到的错误--如果不这样做,那么它是一个旧风格的类,它不支持超级的使用。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6070396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档