<h2>在Python(<a href="http://docs.python.org/2/reference/datamodel.html#emulating-numeric-types" rel="nofollow">docs</a>)中模拟数值类型</h2>
<p>计算表达式<code>a + b</code>时,首先检查<code>a</code>,然后执行<code>__add__</code>实现;如果有,则执行<code>a.__add__(b)</code>。如果没有,或者运行<code>a.__add__(b)</code>返回特殊值<code>NotImplemented</code>,则检查<code>b</code>是否有{<cd8>}实现;如果没有实现或返回{<cd6>},则不能添加它们。在</p>
<h2>你的代码怎么了</h2>
<p>提醒我们的目标:</p>
<pre><code>>>> a = adder(adder2(10))
>>> a.value
adder2
>>> a.value.value
10
>>> b = adder(adder2(12))
>>> b.value
adder2
b.value.value
12
</code></pre>
<p><code>print a + b</code>可以描述为:</p>
^{pr2}$
<h2>怎么办</h2>
<p>我想你是在尝试创建一个可以添加到数字或其类型的其他对象的类型。如果是,你想</p>
<pre><code>class Adder(object):
def __init__(self, value):
self.value
def __add__(self, other):
return self.value + other
def __radd__(self, other):
return self.value + other
</code></pre>
<p>相当于没有<code>+</code>的版本:</p>
<pre><code>class Adder(object):
def __init__(self, value):
self.value
def __add__(self, other):
r = self.value.__add__(other)
if r is NotImplemented:
r = other.__radd__(self.value) # so if other is a adder, use its __radd__
return r # since our value's __add__ will return
__radd__ = __add__
</code></pre>