python中的__radd__函数和return语句

时间:2018-01-14 21:11:50

标签: python

我是Python的绝对初学者。我试图围绕__radd__函数。我阅读Can __radd__ work with the operands in any order?并了解radd用于告诉操作员"我的对象位于右侧"。问题在于,对于下面的一个代码片段(从Lutz'学习Python书中采用),radd会抛出RecursionError

class Commuter3:
    def __init__(self, val):
        self.val = val
    def __add__(self, other):
        print('add', self.val, other)
        return self.val + other
    def __radd__(self, other):
        print('radd was called') 
        return other + self #this return statement is problematic

现在,让我们看看__radd__是否能够添加这两个对象。

#Testing
x3 = Commuter3(13)
y3 = Commuter3(23)
x3+y3

这是输出

...RecursionError: maximum recursion depth exceeded

这是预期的输出:我通过将return other + self更改为return self + other来获得此结果

add 13 <__main__.Commuter3 object at 0x0000014B329E74A8>
radd was called
add 23 13
Out[64]: 36

有人可以解释为什么返回语句会引发堆栈溢出错误吗?我怎么能减轻它?我相信我在这里错过了一些概念。在此先感谢帮助我。

1 个答案:

答案 0 :(得分:1)

执行other + self后,您的对象再次位于添加的右侧,因此再次调用__radd__。这再次调用__radd__,依此类推。 (__add__将这些嵌套调用委托回__radd__,因为左侧操作数是一个int。)

也许你打算做other + self.val,就像你在__add__中所做的那样?正如cOLDsPEED建议的那样,您可能还想在类中包含返回值,即la return Commuter3(other + self.val),否则添加两个Commuter3对象的结果将是int,这通常不是您想要的。但这是一个单独的问题。