__getattribute__ for operators
Piet van Oostrum
piet at cs.uu.nl
Sat Apr 18 16:31:30 EDT 2009
>>>>> Michael <gundlach at gmail.com> (M) wrote:
>M> While thinking about Steven D'Aprano's thread about automatically
>M> generating arithmetic operations for a subclass, I stumbled upon
>M> something confusing. Having defined the following class to do funky
>M> addition,
>M> class MyInt(int):
>M> def __getattribute__(self, key):
>M> if key == "__add__":
>M> print("In __getattribute__('__add__')")
>M> return lambda other: MyInt(int.__add__(self, other+100))
>M> else:
>M> return object.__getattribute__(self, key)
>M> def __getattr__(self, key):
>M> if key == "__add__":
>M> print("In __getattr__('__add__')")
>M> return lambda other: MyInt(int.__add__(self, other+100))
>M> else:
>M> return object.__getattr__(self, key)
>M> I then do this:
>>>>> a = MyInt(4)
>>>>> a.__add__(2)
>M> In __getattribute__('__add__')
>M> 106
>>>>> a + 2
>M> 6
>>>>>
>M> Why doesn't "a + 2" look up the __add__ attribute and use my lambda?
>M> If I manually define __add__(self, other) then "a + 2" will of course
>M> use that method.
This has just been discussed in the thread "Overriding methods
per-object". In short: In newstyle classes these methods when invoked
implicitely, e.g by a+2, are only looked up in the class, and bypass
__getattribute__.
See http://docs.python.org/reference/datamodel.html#special-method-lookup-for-new-style-classes
--
Piet van Oostrum <piet at cs.uu.nl>
URL: http://pietvanoostrum.com [PGP 8DAE142BE17999C4]
Private email: piet at vanoostrum.org
More information about the Python-list
mailing list