я следующий код:Как работает Python 3 super() в этой конкретной ситуации множественного наследования?
class A:
def __init__(self):
print("A.__init__")
class B(A):
def __init__(self):
print("B.__init__")
super().__init__()
class C(A):
def __init__(self):
print("C.__init__")
super().__init__()
class D(B,C):
def __init__(self):
print("D.__init__")
super().__init__()
Когда я создаю экземпляр объекта из класса D,
d = D()
я получил:
>>> d = D()
D.__init__
B.__init__
C.__init__
A.__init__
Почему __init__()
только получил колл класса А-х один раз и в самом конце? Обратите внимание на класс B и класс C, называемый классом A __init__()
, поэтому я ожидал, что класс A __init__()
должен вызываться дважды.
Я прочитал как документацию Python 3, так и блог г-на Хеттингера, но не понял, в чем заключается механизм. Итак, как super()
определяет, что его нужно выполнить только один раз? Благодарю.
Может вниз избиратель, пожалуйста, объясните немного, почему вы проголосовали вниз мой вопрос ?? Я честно не понимаю. Thx –
Каждый метод вызывает 'super() .__ init __()', ** not ** '.. Init. __()'. Почему вы думаете, что «A .__ init__» - это то же самое в этих случаях? –
'super()' смотрит на класс MRO (порядок разрешения метода). Для множественного наследования (график наследования алмазов) MRO все еще будет * linear *, чтобы избежать вызова 'A .__ init __()' более одного раза. Посмотрите на 'D .__ mro__', чтобы увидеть фактический MRO, определенный во время выполнения, вы увидите, что это' [D, B, C, A] '. Прочитайте [Документацию MIP Python] (https://www.python.org/download/releases/2.3/mro/), чтобы узнать, почему и как. –