Derivacion de tipos, interceptar operaciones

Oswaldo Hernández listas en soft-com.es
Mar Mar 18 12:27:26 CET 2008


Chema Cortes escribió:
> 
> Evidentemente, necesitas "metaclases":
> 
> class M(type):
>   def __new__(meta,name,base,dic):
>     dic.update({
>       "Valido":True,
>       "Rango":None,
>       "__new__":_Super_new_,
>     })
>     return type.__new__(meta,name,base,dic)
> 
> class c_int(int):
>   __metaclass__=M
> 
> class c_date(datetime.date):
>   __metaclass__=M
> 
> 
> De manera similar, se pueden definir todos los wrappers a los métodos 
> estáticos dentro de la metaclase:
> 
> 
> Operadores = ("__add__", "__sub__", ....)
> 
> def __wrapper(op):
>   def __supermethod(self, *args,**kwds):
>      if not self.Valido:
>          raise ValueError
>      if hasattr(args[0], "Valido") and not args[0].Valido:
>          raise ValueError
>      return getattr(self.__base__, op)(self, *args, **kwds)
>   return __supermethod
> 
> class M(type):
>   def __new__(meta,name,base,dic):
>     dic.update({
>       "Valido":True,
>       "Rango":None,
>       "__new__":_Super_new_,
>     })
>     for op in Operadores:
>       dic[op]=__wrapper(op)
> 
>     return type.__new__(meta,name,base,dic)
> 
> 
> Lo he hecho muy rápido, así que mejor será que revises y lo ajustes a lo que 
> quieres hacer. Creo que por aquí tienes por donde trabajar.
> 
> 

Uff, esto hay que digerirlo.
He hecho una prueba rápida y no me funciona, lo veré con detenimiento los proximos dias y ya te diré 
si he conseguido adaptarlo a las metaclases.

Gracias.

-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.
_______________________________________________
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