Przeczytałem programowanie w języku Python, które ma przykład dla dziedziczenia wielokrotnego. Autor książki wyjaśnił, ale ja tego nie zrozumiałem, więc chciałbym mieć inny pogląd.Obiekt jest tworzony dwa razy w Pythonie
Przykład pokazuje, że obiekt B
został utworzony dwa razy!
Czy możesz podać mi intuicyjne wyjaśnienie.
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>
Autor książki powiedział:
Dzieje się tak ze względu na wezwanie
A.__init__(self)
, która jest wykonana z instancji C, dzięki czemusuper(A, self).__init__()
połączeńB
„s konstruktora
punktem, z którego nie wpadłem na pomysł, jest to, w jaki sposób wywołanie A.__init__(self)
wywoła super(A, self).__init__()
wywołanie 's konstruktora
Czemu nie używając 'Super 'in C? metoda init? –
Chcę tylko zrozumieć, jak obiekt jest tworzony w Pythonie. – Bryan
Jeśli uważasz, że "super" nazywa się "wywołaj następną metodę w MRO", zamiast "wywołaj moją metodę klasy nadrzędnej", wtedy to zachowanie powinno mieć więcej sensu. W tym przypadku powód, dla którego B jest drukowany dwa razy, jest taki, że super już przygotowuje się do wywołania inicjalizatora B (przez init A), więc kiedy jawnie wywołasz B.init z C, otrzymujesz drugie połączenie. –