有关类Rational python的方法

时间:2013-12-04 19:31:56

标签: class oop python-3.x rational-number

我写了两个方法,我仍然看到两种方法之间没有区别..我的类到目前为止工作正常,但由于方法编写相同,我仍然无法理解为什么当我这样做: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)

2 个答案:

答案 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