2017-02-22 13 views
0
class Parent01(object): 
    def foo(self): 
     print("Parent01") 
     pass 

class Parent02(object): 
    def foo(self): 
     print("Parent02") 
     pass 

class Child(Parent01,Parent02): 
    def foo(self): 
     print("Child") 
     super(Parent01, self).foo() 
    pass 

c = Child() 
c.foo() 

Выход:Python: супер ключевого слова вызова от дочернего класса

Child 
Parent02 

Почему здесь выход Parent02?

+1

Возможный дубликат [Как работает супер() Python с множественным наследованием?] (Http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance). Также [Множественное наследование Python: выбор, который super() для вызова] (http://stackoverflow.com/q/14206015/4831822) –

+0

Возможный дубликат [python3 - поведение супер() при многоуровневом] (http://stackoverflow.com/questions/24166225/python3-behaviour-of-super-on-multi-inheritance) – languitar

ответ

1

Вы неправильно используете super. Вы должны назвать свой собственный класс, а не родителем. И учитывая, что это Python 3, вам даже не нужно, чтобы сделать это, просто:

super().foo() 

будет работать (до тех пор, как первый параметр функции является единственным аргументом, независимо от имени, есть исключения, когда вы принимаете self через *args, но это редко, и только для сложных случаев, связанных с имитацией dict).

Причина, по которой ведет себя плохо, как написано в том, что вы сказали это явно вы делаете super основе в Parent01, не Child, поэтому он сканирует the MRO (method resolution order), чтобы найти следующий класс после Parent01, который бывает Parent02.