super
Возвращает объект-посредник (прокси), делегирующий вызовы методов родителю или собрату класса указанного типа.
super([type[, obj_or_type]])
type -- Тип, от которого следует начать поиск объекта-посредника. До -py3.0 атрибут был обязателен.
obj_or_type -- Если не указан, возвращается несвязанный объект-посредник. Если передан объект, то вернётся посредник для получения метода такого объекта, для которого isinstance(obj, type) возвращает True. Если передан тип, то вернётся посредник для получения метода такого класса, для которого issubclass(subtype, type) возвращает True.
obj_or_type -- Если не указан, возвращается несвязанный объект-посредник. Если передан объект, то вернётся посредник для получения метода такого объекта, для которого isinstance(obj, type) возвращает True. Если передан тип, то вернётся посредник для получения метода такого класса, для которого issubclass(subtype, type) возвращает True.
Используется для доступа к базовым реализациям наследуемых методов, перекрытых в классе-наследнике.
1. В иерархиях с единичным наследованием используется для обращения к родительским классам, чтобы явно не указывать их имена, это упрощает поддержку кода в дальнейшем. Данный тип использования имеет родственников в других языках программирования.
2. Второй вариант используется для поддержки совместного множественного наследования в динамическом окружении. Вариант уникален для Питона и отсутствует в языках статически компилируемых или поддерживающих только единичное наследование. Он делает возможным обращение с ромбовидными иерархиями (см. проблема ромба), при которых несколько базовых классов задают реализацию метода с одним и тем же именем. Правила хорошего проектирования требуют того, чтобы во всех случаях метод имел одну и ту же сигнатуру (в связи с тем, что порядок вызовов определяется во время исполнения, потому как он задаётся при изменении иерархии, и потому что в цепи могут присутствовать собратья, неизвестные до момента исполнения).
Без аргументов функция работает только внутри определения класса: необходимые для идентификации класса и доступа к методам его объекта детали заполняет компилятор.
На заметку
Подробное объяснение в видео — Реймонд Хеттинджер: «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, супер
В разделе «Встроенные функции»:
abs
all
any
apply
ascii
bin
callable
chr
classmethod
cmp
compile
delattr
dir
divmod
enumerate
eval
exec
filter
format
getattr
globals
hasattr
hash
help
hex
id
input
isinstance
issubclass
iter
len
locals
map
max
min
next
oct
open
ord
pow
print
raw_input
reduce
repr
reversed
round
setattr
sorted
staticmethod
sum
unichr
vars
zip
На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.