我是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
有人可以解释为什么返回语句会引发堆栈溢出错误吗?我怎么能减轻它?我相信我在这里错过了一些概念。在此先感谢帮助我。
答案 0 :(得分:1)
执行other + self
后,您的对象再次位于添加的右侧,因此再次调用__radd__
。这再次调用__radd__
,依此类推。 (__add__
将这些嵌套调用委托回__radd__
,因为左侧操作数是一个int。)
也许你打算做other + self.val
,就像你在__add__
中所做的那样?正如cOLDsPEED建议的那样,您可能还想在类中包含返回值,即la return Commuter3(other + self.val)
,否则添加两个Commuter3对象的结果将是int,这通常不是您想要的。但这是一个单独的问题。