proxy class and __add__ method
rhamph at gmail.com
Wed Jul 30 19:54:51 CEST 2008
On Jul 29, 10:23 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
> En Tue, 29 Jul 2008 13:13:51 -0300, Magnus Schuster
> <magnusschus... 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.
This much is true.
> Try implementing a similar __getattr__ method in a metaclass.
But I don't think they use __getattr__.. they bypass it. Effectively
they catch the assignment to __add__ and cache it. You'll have to
always define it in the class and have it be ineffectual in some cases.
More information about the Python-list