0

Я пытаюсь понять this piece of code в python. По моему мнению, super используется для вызова функции базового класса из производного класса, когда вы не хотите явно писать имя базового класса. Но как упоминалось ниже, что это значит, если базовый класс сам использует super для вызова некоторой функции?Когда я должен использовать ключевое слово super в базовом классе в python?

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) 

Я пробовал создавать несколько классов образцов, как указано выше, но я получаю исключение «без такого параметра».

ответ

3

Вы заметите, что ваш класс ReviewCreateView имеет два (прямые) базовые классы. super необходимо убедиться, что метод dispatch вызывается на и этих базовых классов.

Всякий раз, когда класс создается, python смотрит на дерево наследования и выравнивает его, что создает что-то, называемое "Method Resolution Order" (MRO). В этом случае ваш MRO вероятно :

ReviewCreateView, ReviewViewMixin, CreateView, ..., object 

Что super делает это проверяет текущий MRO и он вызывает метод на следующем классе в MRO. Ваш стек вызовов будет выглядеть следующим образом:

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

Теперь заметит, что если ReviewViewMixin не был в там super, стек вызовов закончились бы с ним. Однако, поскольку у него есть super, а следующий класс в MRO - CreateView, метод отправки будет также вызван CreateView.

super может быть сложным, чтобы действительно обернуть вашу голову вокруг - я бы предложил прочитать статью Раймонда Хеттингера о том, какие идеи и передовые методы вы найдете в статье "super is Super".

Вы можете осмотреть MRO с помощью inspect.getmro(ReviewCreateView) или просто глядя на ReviewCreateView.__mro__

+0

Это абсолютно простое и гениальное объяснение. Огромное спасибо. Я потратил слишком много времени на то, чтобы выяснить, что происходит. – Sathish

 Смежные вопросы

  • Нет связанных вопросов^_^