Может кто-нибудь объяснить мне, что здесь происходит стек вызовов? Он называет D, B, C, A. Можете ли вы представить, как это происходит?

1

Я новичок в концепции супер. Я не могу понять стек вызовов, сделанный методом 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() только один раз

Теги:
python-3.x

1 ответ

0

Объяснение можно найти здесь: https://docs.python.org/3.6/library/functions.html#super

В основном вы получаете ETERER суперкласс или брат (с множественным наследованием)

по ссылке:

Второй вариант использования - поддерживать совместное множественное наследование в среде динамического исполнения. Этот вариант использования уникален для Python и не найден в статически скомпилированных языках или языках, которые поддерживают только одно наследование. Это позволяет реализовать "алмазные диаграммы", где несколько базовых классов реализуют один и тот же метод. Хороший дизайн диктует, что этот метод имеет одну и ту же сигнатуру вызова в каждом случае (поскольку порядок вызовов определяется во время выполнения, потому что этот порядок адаптируется к изменениям в иерархии классов и потому, что этот порядок может включать в себя классы-братья, неизвестные до времени выполнения).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню