<p>如果将<code>int</code>对象包装在自定义子类中,则可以对其寻址一次:</p>
<pre><code>class SafeInt(int):
def __div__(self, y):
try:
return SafeInt(super(SafeInt, self).__div__(y))
except ZeroDivisionError:
return SafeInt(0)
</code></pre>
<p>重写<em>所有</em><code>int</code>s:</p>
^{pr2}$
<p>重写一些<em>的</em><code>int</code>:</p>
<pre><code>SafeInt(5) / 0
# O: 0
</code></pre>
<p>但是你要小心保护这个物体。您会注意到我在<code>__div__</code>中返回的所有内容都包装在<code>SafeInt()</code>中。<code>int</code>对象是不可变的,每次都必须显式地返回一个新的<code>SafeInt</code>对象。这意味着您可能需要为<code>SafeInt()</code>中的每个函数生成一个decorator来确保。我把这作为练习留给读者!在</p>
<p>否则你会得到这样的结果:</p>
<pre><code>>>> SafeInt(5) / 0
0 # this is a SafeInt object
>>> _ / 0
0 # this is a SafeInt object; no error
>>> SafeInt(5) + 0
5 # this is a basic int object
>>> _ / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
</code></pre>
<p>最后一个注意事项:您可以将<code>SafeInt</code>作为参数传递给<code>defaultdict</code>,使所有成员<code>SafeInt</code>!在</p>
<hr/>
<p>编辑:知道你想让它发生在<em>all</em><code>int</code>s上,我希望这样的事情可能会奏效,但这是不允许的(有充分的理由):</p>
<pre><code>>>> def wrapdiv(olddiv):
... def newdiv(self, y):
... try:
... olddiv(self, y)
... except ZeroDivisionError:
... return 0
... return newdiv
...
>>> int.__div__ = wrapdiv(int.__div__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'int'
</code></pre>