On 4/17/2015 5:19 PM, Ionel Cristian Mărieș wrote:
__add__ as a property/descriptor seems to work fine, eg:
>>> class C: ... @property ... def __add__(self): ... return lambda other: [self, other] ... >>> C() + C() [<__main__.C object at 0x0000000003652AC8>, <__main__.C object at 0x0000000003652CC0>]
Am I missing something?
An instance method is neither a class method nor a static method. It is also not a property. In your example above, __add__ is a property and not an instance method. This violate the Reference Manual definition of the reserved name '__add__' as an instance method. If f is an one-parameter instance method of class C and c is an instance of C, c.f() == C.f(c). This is not true for a property f, as C.f is not callable, and c.f is only callable if the value of the property is callable. -- What you have done above is to curry what is intended to be a binary instance method into a pair of functions, with the outer, function-returning function getting the original name. Having this curried pair implement the binary operator is quite clever. It works because CPython apparently implements c1 + c2, at least for user class instances, as c1.__add__(c2), instead of the presumed equivalent C.__add__(c1, c2). c1.__add__ is normally a bound method with c1 and C.__add__ as attributes. c1.__add__(c2) then calls C.__add__(c1, c2). In your example, c1.__add__ is a unary function with a captured nonlocal object. Calling it with a second object combines (adds) the two objects. The possibility of @property making this work is new to me. -- Terry Jan Reedy