Michael wrote:
While thinking about Steven D'Aprano's thread about automatically
generating arithmetic operations for a subclass, I stumbled upon
something confusing.  Having defined the following class to do funky
addition,

class MyInt(int):
    def __getattribute__(self, key):
        if key == "__add__":
            print("In __getattribute__('__add__')")
            return lambda other: MyInt(int.__add__(self, other+100))
        else:
            return object.__getattribute__(self, key)

    def __getattr__(self, key):
        if key == "__add__":
            print("In __getattr__('__add__')")
            return lambda other: MyInt(int.__add__(self, other+100))
        else:
            return object.__getattr__(self, key)

I then do this:

a = MyInt(4)
a.__add__(2)
In __getattribute__('__add__')
106
a + 2
6

Why doesn't "a + 2" look up the __add__ attribute and use my lambda?

Answer 1: because it was not programmed that way ;-).

Answer 2: because __getattribute__/__getattr__ are for looking up attributes of instances of the class, whereas special methods are generally required to be attributes of the class. So *their* lookup would use type(MyInt).__getxxx__. When that fails, the add code looks for int.__radd__. (I *think* this your answer.)

> If I manually define __add__(self, other) then "a + 2" will of course
use that method.

because that is that type(MyInt).__getxxx__ will find.

tjr

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to