关于Class Rational python的方法



我写了这两个方法,但我仍然看不出这两种方法之间有什么区别。。到目前为止,我的类运行良好,但由于方法都是一样的,我仍然不明白为什么我这样做: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)被调用了。

相关内容

  • 没有找到相关文章

最新更新