super

super(type, object_or_type=None)

Возвращает объект-посредник (прокси), делегирующий вызовы методов родителю или собрату класса указанного типа.

Параметры

  • type : Тип, от которого следует начать поиск объекта-посредника. Ранее атрибут был обязателен.
  • obj-or-type : Если не указан, возвращается несвязанный объект-посредник. Если атрибут является объектом, то будет получен посредник для получения метода объекта, для которого isinstance(obj, type) возвращает True. Если атрибут является типом, то будет получен посредник для получения метод класса, для которого issubclass(subtype, type) возвращает True. Используется для доступа к базовым реализациям наследуемых методов, перекрытых в классе-наследнике. Порядок поиска метода тот же, что и при getattr(), только type пропускается: тип имеет атрибут mro, в котором задаётся порядок поиска методов, используемый как getattr(), так и super(). Атрибут динамический и может изменяться по мере обновления иерархии наследования.

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

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

Возвращаемое значение

Возвращает объект-посредник (прокси), делегирующий вызовы методов родителю или собрату класса указанного типа.

Примеры

class C(B):
    def method(self, arg):
        super().method(arg)

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