2017-01-28 5 views

ответ

1

чтения: Python's Super Considered Harmful и Python’s super() considered super!.

Это два больших ресурса, которые должны отвечать на все ваши вопросы.

Короче говоря, super() использует стандартный метод разрешения разрешения (MRO), чтобы найти способ, который вы запрашиваете. Посмотрите на эту картинку:

MRO: E, C, A, D, B, object

E наследует от C и D. C наследует от А, и А от object. D наследуется от B и B от object. Красные стрелки показывают MRO, что super() использует в своем поиске.

Отметьте, что super() делает не Ссылка на родительский класс. Несмотря на то, что A наследуется от object, а не D, D приходит в MRO. Поэтому, чтобы ответить на ваш вопрос, «следующий в строке» относится к MRO.

+0

Красная стрела - это то, что я не понимаю. зачем идти от e до c, а не от e до d и т. д. и т. д.? , потому что e наследует как из c, так и d, откуда я узнаю маршрут, который super() собирается взять в MRO? – supreme

+0

Другими словами, почему C получает приоритет над D? и затем идет от C к A, по моему мнению, он должен сначала перейти на C или D, на вашей диаграмме он переходит на C, сначала не находит, что ему нужно, я бы подумал, что он будет выглядеть в D до перехода на A или B. – supreme

1

супер()

Основная цель супер() в Python, чтобы вызвать переопределенный метод базового класса в производном классе, так как супер делает на других языках. Обычно это делается так, что метод производного класса может увеличить базовый класс, вызвав его до или после его собственного кода, а не полностью заменить его. Функция

class Derived(Base): 
    def method(self, arg): 
     # Maybe do something here 
     super(Derived, self).method(arg) 

    # Could so something here as well 

супер() на самом деле работает, возвращая объект класса прокси, что делегаты призывают к родителю. Преимущество использования функции super() в этом случае заключается в том, что вам не нужно явно указывать базовый класс, который помогает ремонтопригодности. Функция

супер() также может быть использован в более сложных ситуациях нескольких наследования, где он может делать такие вещи, как делегат класса сестры

+1

В Python 3 вы можете просто использовать 'super(). Some_method()' для одиночного наследования. Явное связывание не требуется –

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