<p>这不起作用的原因是<code>del</code>在一个原始名称上只会解除对象与该特定名称的绑定。如果对象在其他地方被引用,在本例中是由调用者中的<code>army2</code>引用的,那么对象继续存在<code>del</code>除了拒绝特定名称<code>del</code>-ed下的访问之外,没有任何效果</p>
<p>如果你一定要有这种行为,我建议你做两件事:</p>
<ol>
<li>对于这种行为,不要使操作符过载<code>+</code>预计不会影响任何一个操作数,它应该生成一个全新的对象,并包含这两个操作数的总和/串联。虽然<code>+=</code>可以修改左侧操作数,但不应该修改右侧操作数。重载运算符时,通常的经验法则是“不”,然后是“好的,但前提是它遵守该运算符的预期语义”,这种情况肯定与<code>+</code>或<code>+=</code>的预期语义不匹配</李>
<li><p>现在我们已经决定使用一种方法,您可以通过移除另一支军队的<em>内容</em>从另一支军队中移除军队。例如:</p>
<pre><code>class Army:
def __init__(self, spear, sword, archer):
self.composition = {'spear': spear, 'sword': sword, 'archer': archer}
def absorb_army(self, other): # or transfer_troops or whatever
'''Removes all the troops from other, combining them with the troops of self'''
for item in other.composition:
self.composition[item] += other.composition[item]
other.composition.clear() # Leaves other.composition empty
army1 = Army(10, 20, 30)
army2 = Army(30, 5, 0)
army1.absorb_army(army2)
# army2 still exists, but all the troops in it are gone, moved to army1
</code></pre></li>
</ol>
<p>请注意,我编写的<code>absorb_army</code>可能会违反类的其他约束(因为类的所有元素都应该有<code>composition</code>包括<code>'spear'</code>、<code>'sword'</code>和<code>'archer'</code>)。如果这是一个问题,不要<code>clear</code>它,只要重新分配所有键为零,例如:</p>
<pre><code> def absorb_army(self, other):
for item in other.composition:
self.composition[item] += other.composition[item]
other.composition[item] = 0 # Zero after adding to self
</code></pre>