[英]How to get __add__ called
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
obviously, the first two print statements will work and the third one fails because int. 显然,前两个print语句将起作用,而第三个print语句由于int而失败。 add () cannot deal with a class C instance.
add ()无法处理C类实例。
246
125
print 2 + c
TypeError: unsupported operand type(s) for +: 'int' and 'C'
Is there a way to get around this, so 2+c will cause C. add () to be called? 有没有办法解决这个问题,所以2 + c会导致C. add ()被调用?
You need to add __radd__
as well to handle the reverse case: 您还需要添加
__radd__
来处理相反的情况:
def __radd__(self, other):
if isinstance(other, C):
return other.value + self.value
if isinstance(other, Number):
return other + self.value
return NotImplemented
and note that you should not raise an exception; 并注意您不应提出例外情况; return the
NotImplemented
singleton instead. 返回
NotImplemented
单例。 That way the other object could still try to support __add__
or __radd__
for your object and would be given a chance to implement addition too. 这样, 另一个对象仍然可以尝试为您的对象支持
__add__
或__radd__
,并且也将有机会实现加法。
When you try to add two types a
and b
, Python first tries to call a.__add__(b)
; 当您尝试添加两个类型
a
和b
,Python首先尝试调用a.__add__(b)
; if that call returns NotImplemented
, b.__radd__(a)
is attempted instead. 如果该调用返回
NotImplemented
,则尝试尝试b.__radd__(a)
。
Demo: 演示:
>>> 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
You need to implement __radd__
on the class. 您需要在
__radd__
上实现__radd__
。
def __radd__(self, other):
return self.value + other
This gets called automatically, since the int class will raise a NotImplemented
error 这会自动调用,因为int类将引发
NotImplemented
错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.