Trucos con herencia múltiple (era: Re: Ruby vs Python)

Esteban Manchado Velázquez zoso en foton.es
Mie Sep 28 13:42:09 CEST 2005


Hola:

On Tue, Sep 27, 2005 at 07:57:28PM +0200, Chema Cortes wrote:
> Esteban Manchado Velázquez escribió:
> 
> >    ¿Puedes poner ejemplos? No se me ocurre cómo puedes poner pre y post
> > condiciones, p.ej, con herencia múltiple :-?
> 
> No es el mejor ejemplo, pero así, en sucio:
> 
> class M(object):
> 
>     @staticmethod
>     def deco(fun):
> 	"""Decorador que valida que el argumento es positivo"""
> [...]
> 
>     class __metaclass__(type):
> [...]
> class B(M,A):
>     pass
> 
> b=B()
> b.f1(1)
> b.f1(-1)  # <-- AssertionError
> [...]

    Aunque no entiendo bien los detalles, me aclaras una cosa (creo): decías
que se podían hacer trucos de ésos con herencia múltiple.... _y_ metaclases
_y_ decoradores.

    Lo que no veía era cómo se podían hacer esas virguerías _sólo_ con
herencia múltiple. Es decir, que la herencia múltiple permite hacer cosas
guays en Python, pero quizás no en otros lenguajes.

> >    Probablemente esas cosas no se harían con herencia
> > o mixins (en general, redefinir cosas en Ruby es muy fácil) en Ruby, pero no
> > sé muy bien a qué te refieres.
> 
> No es que diga que no se pueda, ni que estos ejemplos sean la mar de
> elegantes. Mi única intención es conocer mejor los límites (que los hay)
> de los lenguajes que utilizamos.

    Ya, ya. Lo que quería decir es que en Ruby la solución natural a eso es
redefinir métodos, no usar algo relacionado con herencia o mixins.

    Lo que ponías arriba, seguramente se haría con algo así (seudocódigo sin
probar; niños, no lo intenten en casa):

------------------------------------ 8< ------------------------------------
    class MiClase
        # Método de clase: igual saldría de otro sitio
        def self.par_positivo(met)
            # Redefinir el método «met» para que compruebe primero el primer
            # valor, y luego pase todo al original
        end

        def un_metodo_con_comprobacion(par)
            # La Biblia en pasta
        end
        par_positivo :un_metodo_con_comprobacion
    end
------------------------------------ >8 ------------------------------------

Excepto porque quizás «par_positivo» podría venir de la clase padre, no habría
nada relacionado con herencia múltiple. Y si quisieras poner en otro módulo el
«par_positivo», en vez de en su padre (en plan un módulo con métodos útiles de
comprobación de parámetros) podrías usar un mixin.

    Saludos,

-- 
Esteban Manchado Velázquez <zoso en foton.es> - http://www.foton.es
EuropeSwPatentFree - http://EuropeSwPatentFree.hispalinux.es
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://mail.python.org/pipermail/python-es/attachments/20050928/c47481e5/attachment.pgp>
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


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