__getattr__ Confusion
Peter Otten
__peter__ at web.de
Mon Feb 4 13:23:55 EST 2013
Saul Spatz wrote:
> Thanks, Peter. I realize this is getting sort of academic now, as I know
> how to do exactly what I want, but I'm still confused. Is __getattr__ a
> special case then, even for classic classes?
Well, it never occured to me to try a per-instance __getattr__(), but you
are about to answer your own question:
> class Adder(): # python 2.7, classic class
> def __init__(self, x):
> self.x = x
> self.__add__= lambda other: Adder(self.x+other.x)
> self.__getattr__ = lambda name: self.test(name)
>
> def __str__(self):
> return str(self.x)
>
> def test(self, name):
> print("Hello from test")
> raise AttributeError
>
> x = Adder(3)
> y = Adder(4)
> print(x+y)
> x.junk()
>
> 7
> Traceback (most recent call last):
> File "C:\Users\Saul\Documents\PythonProjects\test.py", line 18
> AttributeError: Adder instance has no attribute 'junk'
>
> Why does this work for __add__ and not for __getattr__?
I don't know, I wasn't around when these decisions were made. It could be
the initial performance tweak that would lead to a generalisation with
newstyle classes. Or it is some kind of bootstrapping issue...
More information about the Python-list
mailing list