Re: Un problema de herencia múltiple.

Pavel Muñoz minibota en gmail.com
Lun Ene 14 22:46:45 CET 2008


Podiras decirnos un poco mas directamente, cual es el objetivo de todo
esto?... pregunto esto porque me parece que deberiamos hacer un pequeno
rediseno de tus clases y quiero saber que es exactamente lo que esperas que
hagan.

2008/1/14 José Miguel Sánchez Alés <aussiliar en online.fr>:

> 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
>
_______________________________________________
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