<p>您看到的问题是没有在实例上查找特殊的内置方法。它们是在<code>matrix</code>类型上查找的。因此,在实例上替换它们不会导致它们被间接使用。你知道吗</p>
<p>实现目标的一种方法是将<code>NumpyOverflowPreventer</code>作为要处理的操作的包装器。。。你知道吗</p>
<pre><code>import numpy as np
import sys
class NumpyOverflowPreventer(object):
inverse_operator= {
'__iadd__': '__sub__',
'__isub__': '__add__',
'__imul__': '__div__',
'__idiv__': '__mul__'
}
def __init__(self, matrix):
m = matrix
assert m.dtype==np.uint8
self.matrix = m
self.lower_range = float(0)
self.upper_range = float(2**8-1)
def __iadd__(self, v):
# dynamic way to get the name "__iadd__"
self._operate(v, sys._getframe().f_code.co_name)
return self
def _operate(self, b, forward_operator):
assert type(b) in (int, float)
reverse_operator = self.inverse_operator[forward_operator]
uro= getattr(self.upper_range, reverse_operator)
lro= getattr(self.lower_range, reverse_operator)
afo= getattr(self.matrix, forward_operator)
overflows= self.matrix > uro( b )
underflows= self.matrix < lro( b )
afo( b )
self.matrix[overflows]= self.upper_range
self.matrix[underflows]= self.lower_range
</code></pre>
<p>我只在这里定义了<code>__iadd__</code>,我确信您可以通过一些元类/装饰器操作动态地完成所有这些操作……但我保持简单。你知道吗</p>
<p>用法:</p>
<pre><code>a = np.matrix(255, dtype= np.uint8)
b = np.matrix(255, dtype= np.uint8)
p = NumpyOverflowPreventer(a)
p+=1
p = NumpyOverflowPreventer(b)
p.__iadd__(1)
print a,b
# [[255]] [[255]]
</code></pre>