Re: Un problema de herencia múltiple.

Chema Cortes pych3m4 en gmail.com
Mar Ene 15 16:25:55 CET 2008


El 15/01/08, José Miguel Sánchez Alés <aussiliar en online.fr> escribió:
> El Tue, 15 de Jan de 2008, a las 01:37:39PM +0100, Chema Cortes dijo:
>
> > [...]
> > Lo del MRO (Method Resolution Order) te lo explica aquí:
> > <http://cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html#id837781>
>
> Gracias. Les echaré un vistazo. Esta mañana leí un poco sobre el asunto y
> creí entender cómo resolver la situación:
>
> #v+
> class A(object):
>         def __init__(self):
>                 self.naderia='no hace nada de particular.'
>
> class B1(A):
>         def __init__(self):
>                 self.mensaje='Es heredera de %s...' % B1.__name__
>                 super(B1,self).__init__()
>
>         def declaracion(self):
>                 print self.mensaje
>                 print 'aunque, en realidad, ', self.naderia
>
> class B2(A):
>         def __init__(self):
>                 self.mensaje='Es heredera de %s...' % B2.__name__
>                 super(B1,self).__init__()
>
>         def declaracion(self):
>                 print self.mensaje
>                 print 'Aunque, en realidad, ', self.naderia
>
> class C(A):
>         def __init__(self):
>                 super(C,self).__init__()
>         def declaracion(self):
>                 print 'La clase %s, con la interlocución de %s, hace saber que:' \
>                        %  (self.__class__.__name__,C.__name__)
>                 super(C,self).declaracion()
>
> class D1(C,B1):
>         pass
>
> class D2(C,B2):
>         pass
> #v-
>
> Algo así, ¿no?

Yo creo que es justamente lo que querías.

Si quieres asegurarte más, puedes obtener el orden de búsqueda MRO del
atributo __mro__ :

D1.__mro__ ==> (D1, C, B1, A, object)

Si d1=D1(), entonces la inicialización de d1 empieza en C, quien de
modo explícito pasa el mensaje al superior, B1, y éste se lo pasa
explícitamente a su superior, A.

Lo único que en B2 has puesto super(B1,self) y debería ser
super(B2,self). Si lo pruebas tal cual te dará error por no estar B1
en el MRO de D2.
_______________________________________________
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