0

我写了这两种方法,我仍然看不出这两种方法之间有什么区别..到目前为止我的类工作正常,但是由于方法写的是相同的,我仍然不明白为什么当我这样做时: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)
4

2 回答 2

0

当 Python 求值X+Y时,它首先调用

X.__add__(Y)

如果返回 NotImplemented,则 Python 调用

Y.__radd__(X)

此示例演示何时调用__radd__vs :__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)被调用。

于 2013-12-04T19:36:02.787 回答
0

给定表达式a + b,如果对象a实现__add__了它将被调用b

a.__add__(b)

但是,如果 a 没有实现__add__b实现__radd__(读作“右加”),那么b.__radd__将被调用a

b.__radd__(a)

解释这一点的文档在这里

于 2013-12-04T19:43:44.850 回答