[Python-es] Re:[Python-es]Evolución dinámica de los objetos a diferentes clases

Marcos Sánchez Provencio rapto en arrakis.es
Dom Ago 25 14:34:17 CEST 2002


Perdón por los errores, debería haber escrito seudocódigo para hacer
evidente que no estaba revisado.

Más que casting (crear un objeto a partir de otro) estaba pensando en
morphing (convertir un objeto a otra clase). De ahí lo de utilizar un
método de clase, para no generar un objeto nuevo y tratar siempre con el
anterior. 

El sáb, 24-08-2002 a las 18:53, Chema Cortés escribió:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> El Sáb 24 Ago 2002 11:41, Marcos Sánchez Provencio escribió:
> 
> > Yo creo que debería haber (no sé si hay PEPs de esto) un método especial
> > __cast__ que haría los cambios necesarios.
> 
> 
> Lo más parecido es el __coerce__. Pero sospecho que para ver algún día un 
> operador __cast__ habría que conseguir la unificación real de tipos y clases.
> 
> > unaPersona=Persona()
> > nuevoCliente=Cliente.__cast__(unaPersona, id_cliente=2323)
> 
> 
> En el python actual, el casting lo hace el contructor __init__ utilizando el 
> "polimorfismo" característico de programación orientada a objeto. Es como se 
> simulan las funciones para conversión de tipos. Por ejemplo:
> 
> a=1.0   # float
> a=str(a) # string desde float
> a=complex(a) # complex desde string
> 
> 
> > Ahora veo que no puede ser un método, sino una función estática de la
> > clase.
> > Código para Python 2.2 sin verificar:
> >
> > class Cliente:
> >   def __cast__(objetoBase, **kw):
> >     if type(objetoBase)==TipoPersona:
> >       objetoBase.__class__=Cliente
> >       objetoBase.id_cliente=kw['id_cliente']
> >     else:
> >       raise NotImplemented
> >   __cast__=classmethod(__cast__)
> 
> Ya veo que dices que no lo has revisado, porque hay algunos fallos 
> importantes. Para que __cast__ fuera método estático, debería ser:
> 
>     __cast__=staticmethod(__cast__)
> 
> A parte de esto, type(objetoBase)==TipoPersona no funcionará como esperas tal 
> como están definidas las clases. Deberían utilizar el nuevo mecanismo de 
> generación de clases (que derivan todas de la clase primaria 'object'). 
> También se podría haber utilizado la función 'isinstance()':
> 
>    if isinstance(objetoBase,Persona):
> 
> 
> Pero tal como decía antes, si usamos el constructor polimórfico __init__ para 
> hacer operaciones de casting, quedaría así:
> 
> 
> class Cliente(Persona):
>   def __init__(self,*args):
>     """Interfaces:
> 
>     Cliente(nombre, id_cliente) -> Nuevo cliente
>     Cliente(persona, id_cliente) -> Cliente a partir de persona
>     """
Sigue siendo un _nuevo_ objeto, que era lo que queríamos evitar. En este
caso daría casi igual, pero un caso más complicado (conexiones a BD,
ficheros abiertos, servidores XMLRPC con estados difíciles de
recuperar...) sería más embrollado.
> 
>     if len(args)!=0:
>       raise TypeError, "Necesitaba exactamente 2 argumentos"
> 
>     if type(args[0]) is types.InstanceType:
>        # Nos pasan un objeto
>        obj=args[0]
>        if isinstance(obj, Persona):
>           # Casting a partir de un objeto de la clase "Persona"
>           self.nombre=obj.nombre
>           self.id_cliente=int(args[1])
>        else:
>           # Podíamos mirar otros "castings"
>           # y si no, dar una excepción
>     else:
>        self.nombre=str(args[0])
>        self.id_cliente=int(args[0])
> 
> 
> > De momento habría que llamarlo a pelo, pero quedaría más mono con
> >
> > Cliente[unaPersona, id_cliente=2323]
> 
> Con la última definición sería así:
> 
> Cliente(unaPersona, id_cliente=2323)
> 
> 
> > Parecido a crear una nueva instancia,, pero diferente, o soluciones
> > similares. ¿Un voluntario para sacar un parche para la 2.3? ¿Se puede
> > redefinir __lsub__ para que haga eso?
> 
> No entiendo a qué te refieres con __lsub__
> 
No revisé el texto; supongo que habría que redefinir algo para que la
sintaxis de claseNueva[claseVieja, parámetros] funcionara.

> 
> Saludos,
> - -- 
> Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 8.0
>   ZARALINUX  http://www.zaralinux.org | "La ignorancia se apodera de quien
>     PYTANDO  http://pytando.sf.net    |     se contenta con lo que sabe"
>       PGPKEY: mailto:chemacortes en wanadoo.es?subject=__PGPKEY__
> 
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.0.6 (GNU/Linux)
> Comment: For info see http://www.gnupg.org
> 
> iD8DBQE9Z7n5HLTQrABk8H0RAo1KAJ4jGSKBwpb52N183ErAIy6QBFIszgCg7aak
> TjzzkFxJgAKzmF2H6seG5AE=
> =Y9hC
> -----END PGP SIGNATURE-----
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo.py/python-es






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