2013-08-27 4 views
2

Что такое лучший способ справиться со структурой наследования, как это:множественное наследование с дополнительными свойствами

class A(object): 
    def __init__(self): 
     print('A') 

class B(A): 
    def __init__(self, foo): 
     super(B, self).__init__() 
     self.foo = foo 
     print('B') 

class C(A): 
    def __init__(self, bar): 
     super(C, self).__init__() 
     self.bar = bar 
     print('C') 

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

По сути, я хочу, чтобы быть в состоянии назвать:

>>> d = D('bar', 'ram ewe') 
>>> d.foo 
'bar' 
>>> d.bar 
'ram ewe' 

В настоящее время super(D, self).__init__(foo, bar) поднимает TypeError: __init__() takes exactly 2 arguments (3 given)

EDIT

Рабочий ответ, благодаря Даниэлю Роземан.

class A(object): 
    def __init__(self, *args, **kwargs): 
     print('A') 

class B(A): 
    def __init__(self, foo, *args, **kwargs): 
     super(B, self).__init__(*args, **kwargs) 
     self.foo = foo 
     print('B') 

class C(A): 
    def __init__(self, bar, *args, **kwargs): 
     super(C, self).__init__(*args, **kwargs) 
     self.bar = bar 
     print('C') 

class D(B, C): 
    def __init__(self, foo, bar, *args, **kwargs): 
     super(D, self).__init__(foo, bar, *args, **kwargs) 
+3

См. Также: [super() считается супер] (http://rhettinger.wordpress.com/2011/05/26/super-considered-super/). Вопреки тому, что утверждает принятый ответ http://stackoverflow.com/q/4029550/395760, это очень возможно. – delnan

+0

Хорошо читайте! Спасибо, delnan. –

ответ

3

Лучший способ, чтобы всегда гарантировать, что методы, как определяются и вызываются с помощью синтаксиса *args, **kwargs. Это означает, что они получат необходимые параметры и игнорируют остальные.

+0

Спасибо :) Работал как шарм! –

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