[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