[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