super()Функция super() возвращает proxy-объект, который делегирует вызовы методов родительскому или соседнему классу. Вместо прямого вызова метода родительского класса по имени, super() позволяет Python определить правильный класс для вызова на основе иерархии наследования.
MRO определяет порядок, в котором Python ищет классы при разрешении вызова метода. Python использует алгоритм C3-линеаризации для построения этого порядка. Ты можешь посмотреть его с помощью:
ClassName.__mro__
Например:
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print(D.__mro__)
# (<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>)
super() важна при множественном наследованииБез super(), прямой вызов метода родителя по имени может пропустить классы в иерархии и сломать кооперативное наследование. Использование super() гарантирует, что каждый класс в MRO будет вызван правильно.
class Animal:
def speak(self):
print("Animal speaks")
class Dog(Animal):
def speak(self):
super().speak()
print("Dog barks")
super() всегда следует MRO, а не только прямому родителюsuper() без аргументов достаточен и предпочтителенФункция super() напрямую вызывает метод родительского класса по имени, избавляя от необходимости явно ссылаться на родительский класс в коде.
Новый — ещё не проверен сообществом
Вы