<p>当您执行<code>a + b</code>时,它调用调用<code>self.value.__add__(other)</code>。由于<code>a.value</code>为10,因此调用<code>(10).__add__(b)</code>。由于<code>b</code>是一个<code>adder</code>实例,整数10不知道如何将自身添加到<code>b</code>,因此它返回<code>NotImplemented</code>。在此阶段不调用<code>b</code>的<code>__radd__</code>方法!由于返回<code>self.value.__add__(other)</code>的结果,<code>__add__</code>方法也返回NotImplemented。一旦发生这种情况,调用<code>b.__radd__(a)</code>,并返回<code>NotImplemented</code>,原因相同——它委托给<code>(12).__radd__(a)</code>,但失败了。由于两者都返回<code>NotImplemented</code>,Python认为这些对象不知道如何相互添加,因此会引发错误。在</p>
<p>正如您所发现的,解决方案是使用<code>+</code>,而不是直接调用magic方法。(您不需要为此创建单独的类;只需将<code>adder</code>类改为调用<code>self.value + other</code>,而不是{<cd20>},等等)。当您使用<code>+</code>时,您将激活Python的内部机制,从而在左操作数上调用<code>__add__</code>,如果这不起作用,则对右操作数调用{<cd9>}。当您直接调用<code>__add__</code>和<code>__radd__</code>时,您绕过了这个内部机制,只调用了这两个机制中的一个。这意味着您永远不会到达这样一种状态:两个对象都将自己“还原”为其基础值。相反,您尝试使用左手的<code>__add__</code>,当它失败时,您不会“退回”到<code>__radd__</code>-您将从<code>__radd__</code>重新开始,失去第一部分中所做的“值缩减”。在</p>
<p>关键的是<code>10 + b</code>知道如果<code>(10).__add__(b)</code>失败,就调用<code>b.__radd__(10)</code>,但是如果直接调用<code>(10).__add__(b)</code>,它就不知道<code>__radd__</code>,所以{<cd30>}永远不会被调用。在</p>