2016-12-25 3 views
0

Как объясняется в How does Python's super() work with multiple inheritance?, super может использоваться и в множественном наследовании, так как он будет искать атрибут в обоих родителях. Но какой атрибут? Подкласс уже включает super (если вы посмотрите на код ниже). Как указать атрибут, который я хочу? Мне нужен конструктор Error.Конструктор Python - базовый класс переопределен

class Error(object): 
    def __init__(self, values): 
     self.values = values 

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     Error.__init__(self, *args) 
     super(AddDialog, self).__init__(*args, **kwargs) 
+0

Вы можете использовать 'super'. Фактически, это именно то, для чего. – kindall

+0

Я отредактировал мой вопрос, не могли бы вы взглянуть, пожалуйста? – javanewbie

+0

Этот вопрос уже был дан здесь (http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance) Я полагаю. Вам нужно понять, что такое MRO. Дерево MRO дочернего класса можно найти в разделе «ChildClass .__ mro__'. суперфункция работает с связанными классами и связанными с экземпляром прокси. – Eddie

ответ

1

Это так просто, как пытается это:

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().

+0

Отвечает ли это на ваш вопрос? –

Смежные вопросы