我写了两个方法,我仍然看到两种方法之间没有区别..我的类到目前为止工作正常,但由于方法编写相同,我仍然无法理解为什么当我这样做:x + 1它调用add,1 + x调用radd?
def __add__(self,other):
assert isinstance(other,(Rational,int,str))
other=Rational(other)
n = self.n * other.d + self.d * other.n
d = self.d * other.d
return Rational(n, d)
def __radd__(self,other):
assert isinstance(other,(Rational,int,str))
other=Rational(other)
n =self.d * other.n + other.d * self.n
d=other.d * self.d
return Rational(n, d)
答案 0 :(得分:0)
当Python评估X+Y
时,它首先调用
X.__add__(Y)
if that returns NotImplemented,然后Python调用
Y.__radd__(X)
此示例演示了何时调用__radd__
与__add__
:
class Commuter:
def __init__(self,val):
self.val=val
def __add__(self,other):
print 'Commuter add', self.val, other
def __radd__(self,other):
print 'Commuter radd', self.val, other
x = Commuter(88)
y = Commuter(99)
x+1
# Commuter add 88 1
1+y
# Commuter radd 99 1
x+y
# Commuter add 88 <__main__.Commuter instance at 0xb7d2cfac>
在这种情况下:
In [3]: (1).__add__(y)
Out[3]: NotImplemented
所以y.__radd__(1)
被调用。
答案 1 :(得分:0)
如果表达式a + b
,如果对象a
实现__add__
,则会使用b
调用它:
a.__add__(b)
但是,如果a未实现__add__
而b
实现__radd__
(读作“正确添加”),那么将使用{{1}调用b.__radd__
}}:
a
解释此问题的文档是here。