2016-05-09 1 views
2
class Parent1(object): 
    def foo(self): 
     print "P1 foo" 

    def bar(self): 
     print "P1 bar" 


class Parent2(object): 
    def foo(self): 
     print "P2 foo" 

    def bar(self): 
     print "P2 bar" 



class Child(Parent1, Parent2): 
    def foo(self): 
     super(Parent1, self).foo() 

    def bar(self): 
     super(Parent2, self).bar() 

c = Child() 
c.foo() 
c.bar() 

Намерение состоит в том, чтобы наследовать foo() из Parent1 и bar() из Parent2. Но c.foo(), полученный для parent2 и c.bar(), является результирующей ошибкой. Пожалуйста, укажите на проблему и предложите решение.множественное наследование в python с супер

+2

Первый аргумент 'super' - это класс, который начнет искать« выше »в иерархии наследования, поэтому' foo' будет из 'Parent2', а' bar' будет из 'object' (w у которого нет такого атрибута, предположительно вызывающего ошибку, о которой вы упоминаете только мимоходом). Вместо этого используйте 'Child' и' Parent1' в ваших 'супер'-вызовах. – jonrsharpe

+0

Почему бы просто не использовать 'Parent1.foo()' и 'Parent2.bar()'? – acdr

+0

@jonrsharpe: Спасибо за разъяснение. возможный дублированный вопрос, который вы предложили, имеет функцию инициализации __init__. поэтому я не был уверен, что обычные методы и __init__ будут следовать тому же правилу для наследования – SamCodes

ответ

4

Вы можете вызвать методы непосредственно на родительских классах, предоставив аргумент self вручную. Это должно дать вам самый высокий уровень контроля и быть самым простым способом понять. С другой стороны, это может быть субоптимально.

Вот только Child класс, остальная часть кода остается неизменным:

class Child(Parent1, Parent2): 
    def foo(self): 
     Parent1.foo(self) 

    def bar(self): 
     Parent2.bar(self) 

Запуск фрагмент кода с результатами, описанные изменения в желаемом выходе:

P1 foo 
P2 bar 

See this code running on ideone.com

+0

Мы предоставляем self, когда мы определяем метод для ссылки на объект. Но когда мы вызываем метод из дочернего класса, мы предоставляем его вручную. Итак, как это работает? – SamCodes

+0

Внутри класса 'MyClass' у вас может быть метод, определенный как' def foo (self, arg1, arg2) '. Когда вы запускаете 'my_instance = MyClass()', вы создаете новый экземпляр вашего класса. Теперь вы можете вызвать метод из объекта экземпляра следующим образом: 'my_instance.foo (« Это arg1 »,« Это arg2 »)'. Таким образом, параметр 'self' получает неявно установленный объект экземпляра, на который мы вызываем метод, т. Е. Здесь это будет' my_instance'. Теперь, если мы вызываем тот же метод в определенном классе, мы должны явно указать аргумент 'self':' MyClass.foo (my_instance, «Это arg1», «Это arg2») '. ОК? –

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

  • Нет связанных вопросов^_^