[pyar] Objetos proxy

Alejandro Santos listas en alejolp.com
Jue Jun 10 15:27:21 ART 2010


On 10/06/10 14:52, Claudio Freire wrote:
>
>
> 2010/6/10 Alejandro Santos <listas en alejolp.com <mailto:listas en alejolp.com>>
>
>     On 10/06/10 09:53, Juanjo Conti wrote:
>
>         Retomo algo de otro hilo. Esta implementación de Proxy fue sugerida:
>
>         Encontré que funcionaba para todo lo que quería, pero cuando
>         operaba por
>         ejemplo:
>
>         a = Maybe('8')
>         a+a
>
>         obtenía un error, no se puede sumar str con instance.
>
>         Pensé en hacer que Maybe extienda str, pero me encontré con el
>         problema
>         de que __getattr__ ya no era llamado y print a muentra el valor
>         original
>         en lugar de 'borrado'. Podría user __getattribute__ para si o si
>         interceptar la llamada? cómo? en mis intentos siempre obtengo una
>         excepción de recursión!
>
>
>     http://docs.python.org/reference/datamodel.html#special-method-lookup-for-new-style-classes
>
>     Copio el link:
>
>     For new-style classes, implicit invocations of special methods are
>     only guaranteed to work correctly if defined on an object’s type,
>     not in the object’s instance dictionary.
>
>
> Pero Maybe no es new-style.
>

Sip, tenes razon. Pero str es new-style y de ahi que no se está llamando 
a __getattr__ con name='__add__' en la subclase de str.

Como dijo Darni, debe haber alguna validacion de isinstance. Un work 
around muy trucho es abusar del orden de la operacion add: proxy+str 
funciona.

Pero una vez llamado al __add__ el objeto pierde la decoración del 
proxy, entoces se puede redecorar en el __add__. Algo asi:

class Proxy(object):
     def __init__(self, other):
         self._other = other
     def __getattr__(self, name):
         return getattr(self._other, name)
     def __add__(self, other):
         return Proxy(getattr(self._other, '__add__')(other))

 >>> a=Proxy("Python")
 >>> b=a+"Rulz"
 >>> b
<__main__.Proxy object at 0x7f5697132250>
 >>> b._other
'PythonRulz'

-- 
Alejandro Santos
http://www.alejolp.com.ar



More information about the pyar mailing list