Pythonの__add__と__radd__

pythonでは+演算子の挙動をオーバーライドできる


あるクラスのインスタンスx、yがある場合
x + yとしたとき、インスタンスxの__add__が呼ばれる

インスタンスxに__add__メソッドがない場合、インスタンスyの__radd__が呼ばれる

インスタンスxに__add__メソッド、インスタンスyに__radd__メソッドがある場合、__add__メソッドのみが処理される

__add__も__radd__も存在しない場合はTypeErrorになる

class X:
    def __init__(self, val):
        self.val = val

    def __add__(self, other):
        print 'add', self.val, other


class Y:
    def __init__(self, val):
        self.val = val

    def __radd__(self, other):
        print 'radd', self.val, other

x = X(1)
y = Y(1)


x + x
# add 1 <__main__.X instance at 0x1052547a0>

y + y
# radd 1 <__main__.Y instance at 0x1052547e8>

x + y
# add 1 <__main__.Y instance at 0x1052547e8>

try:
    y + x
except TypeError, e:
    print e
    # TypeError: unsupported operand type(s) for +: 'instance' and 'instance'