po pierwsze, pozwól mi przytoczyć nieco esej z „Expert Python Programming” książki:mieszania Super i klasyczne połączenia w Pythonie
W poniższym przykładzie, klasy C, który wzywa swoich klas bazowych za pomocą metody __init__ będzie sprawić, że klasa B zostanie wywołana dwa razy!
class A(object):
def __init__(self):
print "A"
super(A, self).__init__()
class B(object):
def __init__(self):
print "B"
super(B, self).__init__()
class C(A,B):
def __init__(self):
print "C"
A.__init__(self)
B.__init__(self)
print "MRO:", [x.__name__ for x in C.__mro__] #prints MRO: ['C', 'A', 'B', 'object']
C() #prints C A B B
i wreszcie, tutaj jest wyjaśnienie tego, co się dzieje tutaj:
Dzieje się tak ze względu na A .__ init, __ (samo) rozmowy, który jest wykonany z instancją C, w ten sposób tworząc super (A, self) .__ init __() wywołanie B konstruktora. Innymi słowy, super powinno być użyte w całej hierarchii klas. Problem polega na tym, że czasami część tej hierarchii znajduje się w kodzie strony trzeciej.
Nie mam pojęcia, dlaczego "super(A, self).__init__()
dzwoni do konstruktora B". Proszę wyjaśnij tę chwilę. Wielkie dzięki.
dzięki. jedno pytanie - czy to prawda, że kiedy "super (A, self) .__ init __()" zostaje wywołane w konstruktorze klasy A, jego argument "self" jest równy naszemu instancji C, którą właśnie stworzyliśmy? – varnie
@varnie: tak. Możesz 'print super (A, self)' wewnątrz metody '__init __()' A, aby zobaczyć, że 'self' jest rzeczywiście instancją' C'. –