Python Glossary English

все Python 3ООПфункция

super()

наследование

Возвращает прокси-объект родительского класса. Используется для вызова методов родителя без явного указания имени.

Синтаксис

super().__init__(...)
super().method(...)
super(type, obj_or_type)

super() вызывает не «родителя», а следующий класс в MRO (порядке разрешения методов) — при множественном наследовании это может оказаться не тот класс, что указан в скобках class. Если забыть super().__init__(), инициализация родителя молча не выполнится, и часть атрибутов останется несозданной.

Примеры

class Animal:
    def __init__(self, name):
        self.name = name
class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed
d = Dog('Rex', 'Lab')
print(d.name, d.breed)  # → Rex Lab
class Base:
    def greet(self):
        return 'Hello from Base'
class Child(Base):
    def greet(self):
        return super().greet() + ' and Child'
print(Child().greet())  # → Hello from Base and Child
class LoggedList(list):
    def append(self, item):
        print(f'Adding {item}')
        super().append(item)
ll = LoggedList()
ll.append(1)  # → Adding 1
print(ll)  # → [1]
# Множественное наследование: super() идёт по MRO, а не к «родителю»
class A:
    def __init__(self):
        print('A')
class B(A):
    def __init__(self):
        super().__init__()
        print('B')
class C(A):
    def __init__(self):
        super().__init__()
        print('C')
class D(B, C):
    def __init__(self):
        super().__init__()
        print('D')
D()  # → A / C / B / D
print([k.__name__ for k in D.__mro__])  # → ['D', 'B', 'C', 'A', 'object']

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности