Это так просто, как пытается это:
class Error(object):
def __init__(self, values):
self.values = values
print('Error')
class SizedDialog(object):
def __init__(self, values):
self.values = values
print('SizedDialog')
class AddDialog(SizedDialog, Error):
def __init__(self, *args, **kwargs):
print('AddDialog')
Error.__init__(self, *args)
super(AddDialog, self).__init__(*args, **kwargs)
Теперь super()
не что иное, как идти по порядку разрешения методов (MRO), который вы можете получить с mro()
:
>>> AddDialog.mro()
[__main__.AddDialog, __main__.SizedDialog, __main__.Error, object]
Итак, в вашем случае вы вызываете __init__()
из Error
явно в первую очередь. Тогда super()
будет в этом конкретном случае найти __init__()
SizedDialog
, потому что он прибывает до Error
в MRO.
>>> a = AddDialog(10)
AddDialog
Error
SizedDialog
Если вы используете только super()
(не вызов __init__()
из Error
), вы получите только __init__()
из SizedDialog
:
class AddDialog(SizedDialog, Error):
def __init__(self, *args, **kwargs):
print('AddDialog')
super(AddDialog, self).__init__(*args, **kwargs)
>>> a = AddDialog(10)
AddDialog
SizedDialog
Наконец, если вы только назвать __init__()
из Error
, это только __init__()
это называется.
class AddDialog(SizedDialog, Error):
def __init__(self, *args, **kwargs):
print('AddDialog')
Error.__init__(self, *args)
>>> a = AddDialog(10)
AddDialog
Error
Так что ваш вопрос:
Но что атрибут?
есть ответ:
кого вы называете.
Это не имеет значения, если вы жесткий провод класс, как это было сделано с Error
, или пусть super()
найти соответствующий родительский класс, то есть на следующий один в MRO. Единственное отличие состоит в том, что super()
может называть __init__()
класса grandparent, если родительский класс не имеет __init__()
. Но это предполагаемое поведение super()
.
Вы можете использовать 'super'. Фактически, это именно то, для чего. – kindall
Я отредактировал мой вопрос, не могли бы вы взглянуть, пожалуйста? – javanewbie
Этот вопрос уже был дан здесь (http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance) Я полагаю. Вам нужно понять, что такое MRO. Дерево MRO дочернего класса можно найти в разделе «ChildClass .__ mro__'. суперфункция работает с связанными классами и связанными с экземпляром прокси. – Eddie