proxy class and __add__ method

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Wed Jul 30 00:23:56 EDT 2008


En Tue, 29 Jul 2008 13:13:51 -0300, Magnus Schuster  
<magnusschuster at yahoo.com> escribi�:

> Hello,
> I have written the following small proxy class which I expect to pass all
> function calls to the 'original' object:
>
> --- BEGIN ---
> class proxy(object):
>     def __init__( self, subject ):
>         self.__subject = subject
>     def __getattr__( self, name ):
>         return getattr( self.__subject, name )
>
> prx_i=proxy(1)
> print hasattr(prx_i,'__add__')
> j=prx_i.__add__(1)
> k=prx_i+1
> --- END ---
>
> Actually the "hasattr(prx_i,'__add__')" returns "True" as expected, and
> "j=prx_i.__add__(1)" sets j=2.
>
> But "k=prx_i+1" raises a
> <type 'exceptions.TypeError'>: unsupported operand type(s) for +: 'proxy'
> and 'int'.
>
> How is this addition different from the previous line "j=..."? And how  
> can I
> modify the proxy class so that all methods are passed on, which are not
> explicitly overloaded?

__magic__ methods on new style classes are searched in the class, *not* in  
the instance. prx_i+1 looks for __add__ in type(prx_i), that is, in the  
proxy class. Try implementing a similar __getattr__ method in a metaclass.

-- 
Gabriel Genellina




More information about the Python-list mailing list