因此,我正在重写一个ModelAdmin方法:
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我不想在每一款车上重复这件事,我想把它做成一个混音。
如果我这样做了:
def RedirectMixin(admin.ModelAdmin)然后:
def MyModel(admin.ModelAdmin, RedirectMixin)然后我得到一个MRO错误。
但是,如果RedirectMixin不从admin.ModelAdmin继承,那么该方法就不会被调用。
另一个问题是如何泛化super()调用,使其不需要硬编码的超类。
发布于 2011-05-20 10:35:51
首先,我想在你的例子中,你指的是class而不是def。
无论如何,正确的使用Mixin的方法是在要继承的类列表中首先使用它。所以:
class RedirectMixin(object):和
class MyModelAdmin(RedirectMixin, admin.ModelAdmin):这是因为Python按照声明的顺序查找所有父类,并调用它找到的第一个方法。
至于超级,这根本不应该提到超类--这就是它的全部意义。它应该引用当前类:
return super(MyModelAdmin, self).__init__(self, *args, **kwargs)或者别的什么。
编辑在注释是的之后,混音应该在super调用中引用它自己的类。请考虑以下几点:
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继承:
In [4]: m=MyDerivedClass()
In [5]: m.my_function()
mixin my_function
base my_function如果您不能使Mixin成为object的后代,则会出现您提到的错误--如果不这样做,那么它是一个旧风格的类,它不支持超级的使用。
https://stackoverflow.com/questions/6070396
复制相似问题