class C(object):
def __init__(self, value):
self.value = value
def __add__(self, other):
if isinstance(other, C):
return self.value + other.value
if isinstance(other, Number):
return self.value + other
raise Exception("error")
c = C(123)
print c + c
print c + 2
print 2 + c
显然,前两个打印语句会起作用,第三个打印语句会失败,因为int。 add ()无法处理C类实例。
246
125
print 2 + c
TypeError: unsupported operand type(s) for +: 'int' and 'C'
有没有办法绕过这个,所以2 + c会导致C. 添加()被调用?
答案 0 :(得分:4)
您还需要添加__radd__
来处理相反的情况:
def __radd__(self, other):
if isinstance(other, C):
return other.value + self.value
if isinstance(other, Number):
return other + self.value
return NotImplemented
并注意你不应该提出异常;改为返回NotImplemented
单身。这样,其他对象仍然可以尝试为您的对象支持__add__
或__radd__
,并且也有机会实现添加。
当您尝试添加两种类型a
和b
时,Python首先尝试调用a.__add__(b)
;如果该调用返回NotImplemented
,则会尝试b.__radd__(a)
。
演示:
>>> from numbers import Number
>>> class C(object):
... def __init__(self, value):
... self.value = value
... def __add__(self, other):
... print '__add__ called'
... if isinstance(other, C):
... return self.value + other.value
... if isinstance(other, Number):
... return self.value + other
... return NotImplemented
... def __radd__(self, other):
... print '__radd__ called'
... if isinstance(other, C):
... return other.value + self.value
... if isinstance(other, Number):
... return other + self.value
... return NotImplemented
...
>>> c = C(123)
>>> c + c
__add__ called
246
>>> c + 2
__add__ called
125
>>> 2 .__add__(c)
NotImplemented
>>> 2 + c
__radd__ called
125
答案 1 :(得分:2)
您需要在课程上实施__radd__
。
def __radd__(self, other):
return self.value + other
这会自动调用,因为int类会引发NotImplemented
错误