Un problema de herencia múltiple.

José Miguel Sánchez Alés aussiliar en online.fr
Lun Ene 14 22:05:52 CET 2008


Antes de nada, un saludo a la lista.

A ver si podéis echarme una mano para mejorar el código. Resulta que
tengo el siguiente esquema de clases:

class A(object)                <----- Nivel 1
    def __init__
    def cuota
    def deuda
    
class B1(A) y class B2(A)      <----- Nivel 2
    def __init__
    def Z__
    def K__

class C(A)                     <----- Nivel 3
    def __init__
        Debe invocar el __init__ de B1 ó de B2
    def cuota
    def deuda
    def Z__
        Debe invocar la Z__ de B1 ó B2

class D1(B1,C) y D2(B2,C)      <----- Nivel 4
    def __init__
        Invoca el __init__ de C

La clase C es simplemente un clase auxiliar que usan D1 y D2. El
problema está en lo siguiente:

Si defino los antecesores de D1 (el mismo razonamiento para D2) como
B1,C resulta que al invocar los métodos deuda y plazo se ejecutan los
métodos de A y yo quiero que se ejecuten los métodos de C (que serán los
que invoquen a los de A)

En cambio si defino C,B1, D1 invoca el método __init__ de C (bien), pero
en dicho método no es posible invocar el método __init__ de B1 (o de B2
en el caso de D2), porque super(C,self) es A y super(self.__class__,self)
es el propio C. Lo mismo pasa con Z__.

Sólo se me han ocurrido dos soluciones que me parecen un poco
chapuceras:

1) Definir los antecesores de D1 como B1,C y en el propio D1 definir
   cuota y deuda para que invoquen los métodos cuota y deuda de C. Es
   chapucera esta solución porque tengo que definir esos dos métodos
   únicamente para que invoquen los correspondientes de C.

2) Definir los antecesores de D1 como C,B1 y añadirle al __init__ de C
   un argumento que sea "clasePadre". Cuando lo invoca D1 clasePadre=B1
   y cuando lo invoca D2 clasePadre=B2. Así C sabe si tiene que invocar
   a B1 o a B2. No me convence tampoco.

¿Se os ocurre algo mejor?

-- 
-- Hoy he reñido a un hostelero.
-- ¿Por qué? ¿Cuándo? ¿Dónde? ¿Cómo?
-- Porque cuando donde como
   sirven mal, me desespero
                  --- Tomás de Iriarte ---
   Si     Dióxido de Silicio |        Debian GNU/Linux 
  /  \         (SiO2)        |    José Miguel Sánchez Alés
 O    O   Mineral de Cuarzo  |  aussiliar en online.fr | URL #257033
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es