Возвращает объект-посредник (прокси), делегирующий вызовы методов родителю или собрату класса указанного типа.
super([type[, obj_or_type]])
type -- Тип, от которого следует начать поиск объекта-посредника. До -py3.0 атрибут был обязателен.

obj_or_type -- Если не указан, возвращается несвязанный объект-посредник. Если передан объект, то вернётся посредник для получения метода такого объекта, для которого isinstance(obj, type) возвращает True. Если передан тип, то вернётся посредник для получения метода такого класса, для которого issubclass(subtype, type) возвращает True.

Используется для доступа к базовым реализациям наследуемых методов, перекрытых в классе-наследнике.

На заметку
Подробное объяснение в видео — Реймонд Хеттинджер: «Super — это супер!».

На заметку
Порядок поиска метода тот же, что и у getattr(), только type пропускается: тип имеет атрибут __mro__, в котором задаётся порядок поиска методов, и который используется как getattr(), так и super(). Атрибут динамический и может изменяться по мере обновления иерархии наследования.

Типичные случаи использования super()



1. В иерархиях с единичным наследованием используется для обращения к родительским классам, чтобы явно не указывать их имена, это упрощает поддержку кода в дальнейшем. Данный тип использования имеет родственников в других языках программирования.

2. Второй вариант используется для поддержки совместного множественного наследования в динамическом окружении. Вариант уникален для Питона и отсутствует в языках статически компилируемых или поддерживающих только единичное наследование. Он делает возможным обращение с ромбовидными иерархиями (см. проблема ромба), при которых несколько базовых классов задают реализацию метода с одним и тем же именем. Правила хорошего проектирования требуют того, чтобы во всех случаях метод имел одну и ту же сигнатуру (в связи с тем, что порядок вызовов определяется во время исполнения, потому как он задаётся при изменении иерархии, и потому что в цепи могут присутствовать собратья, неизвестные до момента исполнения).

На заметку
Использовать super() с двумя аргументами можно, как и любую другую функцию, то есть, не только в методах.

    class C(B):
def method(self, arg):
# Python 3
super().method(arg)
# То же, что и для Python 2
super(C, self).method(arg)

На заметку
Функция реализована как часть процесса связывания (объект — атрибут), для случаев, когда атрибут разрешается явно — через точку, таких как super().__getitem__(name). Функционирует это благодаря реализации собственного .__getattribute__(), использующегося для поиска классов в предсказуемом порядке, принимающем во внимание совместное множественное наследование. Поэтому super() не поддерживает неявное разрешение с помощью инструкций или операторов, поэтому, например, super()[name] не сработает.

Без аргументов функция работает только внутри определения класса: необходимые для идентификации класса и доступа к методам его объекта детали заполняет компилятор.

На заметку
Python 2. Функция работает только с классами нового стиля (явно наследующимися от object).
Синонимы поиска: super, супер
На заметку
Зарегистрированные пользователи могут публиковать свои Статьи.