llamando a init para múltiples clases para padres con super?

Posible duplicado:
¿Puede Super tratar con herencia múltiple?

La herencia de Python? Tengo una estructura de clase (abajo), y quiero que la clase infantil llame al __init__ de ambos padres. ¿Se puede hacer esto de una manera ‘súper’ o es solo una idea terrible?

 class Parent1(object): def __init__(self): self.var1 = 1 class Parent2(object): def _init__(self): self.var2 = 2 class Child(Parent1, Parent2): def __init__(self): ## call __init__ of Parent1 ## call __init__ of Parent2 ## super(Child, self).__init__() 

La invocación a través de super no llama a todos los padres, llama a la siguiente función en la cadena MRO. Para que esto funcione correctamente, debe usar super en todos los __init__ s:

 class Parent1(object): def __init__(self): super(Parent1, self).__init__() self.var1 = 1 class Parent2(object): def __init__(self): super(Parent2, self).__init__() self.var2 = 2 class Child(Parent1, Parent2): def __init__(self): super(Child, self).__init__() 

En Python 3, puedes usar super() lugar de super(type, instance) .

La idea de super() es que no tiene que molestarse en llamar a los métodos __init__() ambas superclases por separado. super() se ocupará de ello, siempre que lo use correctamente. considerado super! ” para una explicación.

Dicho esto, a menudo encuentro que las desventajas de super() para las llamadas de constructores superan las ventajas. Por ejemplo, todos sus constructores deben proporcionar un argumento **kwargs , todas las clases deben colaborar, las clases externas que no colaboran necesitan un envoltorio, debe cuidar que cada nombre de parámetro de constructor sea único en todas sus clases, etc.

Entonces, la mayoría de las veces, creo que es más fácil nombrar explícitamente los métodos de la clase base que desea llamar para las llamadas de constructores:

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

Utilizo super() para funciones que tienen un prototipo garantizado, como __getattr__() , sin embargo. No hay inconvenientes en estos casos.

Puede simplemente llamarlos directamente con Parent.__init__(self) :

 class Parent1(object):  def __init__(self):    self.var1 = 1 class Parent2(object):  def __init__(self):    self.var2 = 2 class Child(Parent1, Parent2):  def __init__(self): Parent1.__init__(self) Parent2.__init__(self) print(self.var1, self.var2)