2014-11-09 8 views
5

Извините, если этот вопрос задан раньше, я не смог найти ответ во время поиска других вопросов.Вопросы множественного наследования Python

Я новичок в Python, и у меня проблемы с множественным наследованием. Предположим, у меня есть 2 классов, B и C, которые наследуют от того же класса А, которые определяются следующим образом:

class B(A): 
    def foo(): 
     ... 
     return 

    def bar(): 
     ... 
     return 


class C(A): 
    def foo(): 
     ... 
     return 

    def bar(): 
     ... 
     return 

Теперь я хочу, чтобы определить другой класс D, который наследуется от обоих B и C. D должны наследует реализацию B foo, но реализация C в баре. Как мне это сделать?

+1

это известно как проблема алмаза - http://mypythonnotes.wordpress.com/2008/11/01/python-multiple-inheritance-and-the-diamond-problem/ –

+0

это лучше сказать, что вам нужно, в 'D .__ init__' вы можете 'self.bar = C.bar' –

+0

' super(). foo() 'в классе D будет называть' B.foo() 'однажды' B' перед 'C' в mro –

ответ

11

Сопротивляясь искушению сказать «избежать этой ситуации, в первой очереди», один (не обязательно элегантное) решение может быть, чтобы обернуть методы в явном виде:

class A: pass 

class B(A): 
    def foo(self): print('B.foo') 
    def bar(self): print('B.bar') 

class C(A): 
    def foo(self): print('C.foo') 
    def bar(self): print('C.bar') 

class D(B, C): 
    def foo(self): return B.foo(self) 
    def bar(self): return C.bar(self) 

В качестве альтернативы вы можете сделать определение Явным метода, без упаковки:

class D(B, C): 
    foo = B.foo 
    bar = C.bar 
Смежные вопросы