我写了这两个方法,但我仍然看不出这两种方法之间有什么区别。。到目前为止,我的类运行良好,但由于方法都是一样的,我仍然不明白为什么我这样做: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)
给定表达式a + b
,如果对象a
实现__add__
,则将使用b
:调用它
a.__add__(b)
但是,如果a不实现__add__
,而b
实现__radd__
(读作"右加"),则b.__radd__
将用a
:调用
b.__radd__(a)
解释这一点的文档在这里。
Python评估X+Y
时,首先调用
X.__add__(Y)
如果返回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)
被调用了。