Я новичок в концепции супер. Я не могу понять стек вызовов, сделанный методом m каждого класса в этом коде
class A:
def m(self):
print("m of A called")
print("OUT OF A")
class B(A):
def m(self):
print("m of B called")
super().m()
print("OUT OF B")
class C(A):
def m(self):
print("m of C called")
super().m()
print("OUT OF C")
class D(B,C):
def m(self):
print("m of D called")
super().m()
print("OUT OF D")
x = D()
x.m()
Результат следующего:
m of D called
m of B called
m of C called
m of A called
OUT OF A
OUT OF C
OUT OF B
OUT OF D
Как супер от D вызывает B.() и C.(), который вызывает Am() только один раз
Объяснение можно найти здесь: https://docs.python.org/3.6/library/functions.html#super
В основном вы получаете ETERER суперкласс или брат (с множественным наследованием)
по ссылке:
Второй вариант использования - поддерживать совместное множественное наследование в среде динамического исполнения. Этот вариант использования уникален для Python и не найден в статически скомпилированных языках или языках, которые поддерживают только одно наследование. Это позволяет реализовать "алмазные диаграммы", где несколько базовых классов реализуют один и тот же метод. Хороший дизайн диктует, что этот метод имеет одну и ту же сигнатуру вызова в каждом случае (поскольку порядок вызовов определяется во время выполнения, потому что этот порядок адаптируется к изменениям в иерархии классов и потому, что этот порядок может включать в себя классы-братья, неизвестные до времени выполнения).