__getattr__ Confusion

Peter Otten __peter__ at web.de
Mon Feb 4 19:23:55 CET 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