クラスが次のようになっているとします。
class mytime(object):
def __init__(self, h, m):
self.h = h
self.m = m
def __add__(self, other):
return mytime(self.h + other.h, self.m + other.m)
def __repr__(self):
return '%i:%i' % (self.h, self.m)
次のように使用します。
a = mytime(10, 10)
b = mytime(2, 22)
print a + b
期待どおりに動作します:
12:32
問題:
あなたがしたいことは次のとおりです。
l = [a, b]
print sum(l)
しかし、それは失敗します:
TypeError: + のサポートされていないオペランド型: 'int' および 'mytime'
問題は、sum
関数が開始0
され、リストのすべての値を合計することです。評価しようとするだろう
0 + mytime(10, 10)
これは失敗します。
解決:
問題の解決策は、__radd__
「逆加算」を表し、引数を「順方向」に解決できない場合に呼び出される関数を実装することです。たとえば、x + y
は可能であると評価されx.__add__(y)
ますが、それが存在しない場合、Python は を試みy.__radd__(x)
ます。
したがって、次のメソッドをクラスに追加できます。
def __radd__(self, other):
return mytime(self.h, self.m)
そしてsum
関数はあなたのために働きます(この実装ではother
値を無視していますが、あなたの場合はおそらく問題ありません)。