все 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Сообщить о неточности