On Fri, Mar 19, 2010 at 12:46 PM, Alex A. Naanou <alex.na...@gmail.com> wrote: > A friend of mine stumbled upon the following behavior: > > > ---cut--- > >>>> class A(object): pass > ... >>>> class B(object): > ... def __add__(self, other): > ... print 'B: adding B and %s objects.' % other.__class__.__name__ > ... >>>> class C(object): > ... def __radd__(self, other): > ... print 'C: adding C and %s objects.' % other.__class__.__name__ > ... >>>> a, b, c = A(), B(), C() > >>>> b + c > B: adding B and C objects. > >>>> a + c > C: adding C and A objects. > > > # so far, quite logical. now let's do this: > >>>> 1 + c > C: adding C and int objects. > > > --uncut-- > > My first expectation would be to get a TypeError here, as ints indeed > have an __add__ method, and they do not know anything about C objects > (obviously :) ).
Yes: the int.__add__ method is tried first. Since it doesn't know anything about C objects it returns NotImplemented, and then C.__radd__ is given a chance to do the addition. The rules are documented here: http://docs.python.org/reference/datamodel.html#coercion-rules Mark _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com