39

Вопрос по python – Как порядок миксинов влияет на производный класс?

Error: User Rate Limit Exceededdispatch():

class FooMixin(object):
    def dispatch(self, *args, **kwargs):
        # perform check A
        ...
        return super(FooMixin, self).dispatch(*args, **kwargs)

class BarMixin(object):
    def dispatch(self, *args, **kwargs):
        # perform check B
        ...
        return super(FooMixin, self).dispatch(*args, **kwargs)

Если я хочу, чтобы мой вид прошел через заказ, отметьте A - & gt; проверьте B, должен ли мой код бытьMyView(FooMixin, BarMixin, View)Error: User Rate Limit ExceededMyView(BarMixin, FooMixin, View)?

Error: User Rate Limit ExceededViewError: User Rate Limit Exceeded

  • @agf. Конечно. Виноват.objectотправка будет называться последней. Мое утверждение действительно должно было быть вопросом, но я отвлекся и забыл сделать это явным. Спасибо за ответ в любом случае :)

    от
  • спасибо Мой вопрос должен был быть «почему он добавлен к последнему» и ты ответил на это. Приветствия.

    от tamakisquare
  • @MadPhysicist Это не совсем верно. Это будет работать, даже если метод также определен объектом - попробуйте сами. Смотрите связанный ответ для получения дополнительной информации.

    от
  • Error: User Rate Limit ExceededFooMixin.dispatch. super(FooMixin, self).dispatch затем оцениваетBarMixin.dispatchError: User Rate Limit Exceededobject не имеетdispatchError: User Rate Limit Exceededsuper(BarMixin, self).dispatchError: User Rate Limit ExceededUltimateBase.dispatch по той же причине.

    от
  • 69

    Error: User Rate Limit Exceeded

    __mro__ attributeFooMixin

    class UltimateBase(object):
        def dispatch(self, *args, **kwargs):
            print 'base dispatch'
    
    class FooMixin(object):
        def dispatch(self, *args, **kwargs):
            print 'perform check A'
            return super(FooMixin, self).dispatch(*args, **kwargs)
    
    class BarMixin(object):
        def dispatch(self, *args, **kwargs):
            print 'perform check B'
            return super(BarMixin, self).dispatch(*args, **kwargs)
    
    class FooBar(FooMixin, BarMixin, UltimateBase):
        pass
    
    FooBar().dispatch()
    

    perform check A
    perform check B
    base dispatch
    

    View