[Pytho-es] metaclases y operaciones con clases

Israel Fernández Cabrera iferca en gmail.com
Dom Jul 1 00:39:08 CEST 2007


Hola, aquí te va un ejemplo que quizá debas depurar un poco, se asumen
algunas cosas:

1. Si alguien está a la izquierda entonces tiene la metaclase que suma métodos.
2. El "callable" de la derecha no recibe argumentos

Pero igual por ahí te vas guiando:

<código>

class MetaClass(type):
    def __add__(cls, another):
        def __call__deco(func):
            def wrapper(*arg, **kwarg):
                anotherInstance = another()
                anotherInstance()
                return func(*arg, **kwarg)
            return wrapper
        if hasattr(another, "__call__") and hasattr(cls, "__call__"):
            cls.__call__ = __call__deco(cls.__call__)
            return cls

class A(object):
    __metaclass__ = MetaClass
    def __call__(self, a, b):
        print a * b

class B(object):
    def __call__(self):
        print "Hola"

NewA = A + B
nA = NewA()
nA(8, 2)

</código>

No obstante no poder ni imaginarme que quieres hacer con esto, creo
que las metaclases van bien simplemente dónde son la solución más
limpia y la más "entendible" la que exprese mejor la intención, igual
si lo que tienes son dos instancias y lo puedes hacer como lo hiciste
abajo... creo que está perfecto. Otro criterio es que el código quede
bien KISS, creo que las metaclases no ayudan mucho a esto último :P

S en lu2

On 6/30/07, tny <a.porrua en gmail.com> wrote:
>
> > Cuando uno sabe todo lo que necesita saber para programar, viene david
> > con su pequeña gran introducción a las metaclases a complicarnos la vida
> > XD
> >
> > Pues tenía un proyectín en mente que iba a hacer, cómo no, sin
> > metaclases. Pues casualidades de la vida, que me he dado cuenta de que
> > las meta clases me vienen de perlas.
> >
> > Sólo hay un único problema, que ahora me encuentro en medio del desierto
> > porque no quiero hacerlo sin y no sé hacerlo con...
> >
> > La duda y cuestión: ¿con metaclases se podría hacer lo siguiente?¹
> >
> >
> > >>>class producto:
> > ...   def __call__(self,a,b):
> > ...           return a*b
> >
> > >>>class hola:
> > ...   def __call__(self):
> > ...           print "hola"
> >
> > >>>suma=hola+producto # he aquí el quid de la cuestión
> >
> > >>>s=suma()
> >
> > >>>s(5,6)
> > hola
> > 30
> >
> >
> > ________________________________________________________
> > ¹ paste-copy de ficcion, no intente esto en su ordenador
> >
> >
>
> sin metaclases yo lo haría así más o menos.
>
> class Comando:
>         def __init__(self,funciones=[]):
>                 self.funciones=funciones
>         def __call__(self,*parametros):
>                 return [funcion(*parametros) for funcion in self.funciones]
>         def __add__(self,other):
>                 return Comando(self.funciones+other.funciones)
>
>
>
> >>> def producto(a,b,*resto):
>         return a*b
>
> >>> def hola(*resto):
>         print "hola"
>
>
> >>> Producto=Comando([producto])
> >>> Hola=Comando([hola])
> >>> Suma=Producto+Hola
> >>> Suma(5,6)
> hola
> [30, None]
>
> Pero ni Producto, ni Hola son clases.
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es
>
>


-- 
____________________
Israel Fdez. Cabrera
iferca en gmail.com

 . 0 .
 . . 0
 0 0 0




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