, во-первых, позвольте мне процитировать чуток эссе от «Эксперт Python Программирование» книги:смесительные супер и классические звонки в Python
В следующем примере C класса, который называет свои базовые классы с использованием метода __init__ будет , чтобы класс B был вызван дважды!
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
и, наконец, вот объяснение того, что происходит здесь:
Это происходит из-за A .__ инициализации __ (само) вызова, который сделан с экземпляром C, таким образом создавая супер (A, self) .__ init __() вызывает конструктор B. Иными словами, super должен использоваться во всей иерархии классов. Проблема в том, что иногда часть этой иерархии находится в стороннем коде.
Я понятия не имею, почему «super(A, self).__init__()
вызывает конструктор B». Пожалуйста, объясните этот момент. Большое спасибо.
спасибо. один вопрос - верно ли, что, когда «super (A, self) .__ init __()» вызывается в конструкторе класса A, его аргумент «self» равен нашему экземпляру C, который мы только что создали? – varnie
@varnie: да. Вы можете 'напечатать супер (A, self)' внутри '' __init __() 'метод, чтобы увидеть, что' self' действительно является экземпляром 'C'. –