Я прочитал программу программирования экспертов Python, которая имеет пример для многоуровневого. Автор книги объяснил, но я этого не понял, поэтому хотел бы получить другое представление.Объект создается дважды в Python
Пример показывает, что объект B
создан два раза!
Не могли бы вы дать мне интуитивное объяснение.
In [1]: class A(object):
...: def __init__(self):
...: print "A"
...: super(A, self).__init__()
In [2]: class B(object):
...: def __init__(self):
...: print "B"
...: super(B, self).__init__()
In [3]: class C(A,B):
...: def __init__(self):
...: print "C"
...: A.__init__(self)
...: B.__init__(self)
In [4]: print "MRO:", [x.__name__ for x in C.__mro__]
MRO: ['C', 'A', 'B', 'object']
In [5]: C()
C
A
B
B
Out[5]: <__main__.C at 0x3efceb8>
Автор книги говорит:
Это происходит из-за
A.__init__(self)
вызова, который сделан с экземпляром C, таким образом, делаяsuper(A, self).__init__()
вызоваB
«s конструктор
точка, из которой я не понял, как A.__init__(self)
вызов сделает super(A, self).__init__()
вызов B
's constructor
Почему вы не используете 'супер 'в методе init C? –
Я просто хочу понять, как объект создается в Python. – Bryan
Если вы считаете, что вызов 'super' означает« вызов следующего метода в MRO », а не« вызов метода моего родительского класса », тогда это поведение должно иметь больше смысла. В этом случае причина, по которой вы дважды печатаете B, состоит в том, что супер уже организует вызов B для init (по инициативе A), и поэтому, когда вы явно вызываете B.init из C, вы получаете второй вызов. –