在python中创建饱和整数的类型的最佳方法是什么?
即:
v = SaturatedInteger(0, 100)
# That should create an integer that will always be in between 0 and 100,
# and have all default operations
v += 68719
print v #Should print '100'.
我可以考虑继承int
类型,但是在那里应该实现饱和逻辑呢?
答案 0 :(得分:3)
如果您需要一个新的(快速和脏)类,我将按如下方式实现它。
class SaturatedInteger:
def __init__(self, val, lo, hi):
self.real, self.lo, self.hi = val, lo, hi
def __add__(self, other):
return min(self.real + other.real, self.hi)
def __sub__(self, other):
return max(self.real - other.real, self.lo)
...
在the docs中添加您认为需要的其他运算符(以及他们的“r
”变体)。
通过将值存储在实例名称real
中,您可以使用常规整数,浮点数等进行算术运算:
a = SaturatedInteger(60, 0, 100)
print(a)
60
print(a+30)
90
print(a+40)
100
print(a+50.)
100
print(a-70.)
0
print(a+a)
100
当然,如果您要向SaturatedInteger
添加复数,只会添加实际部分,所以请注意。 (对于更加完整和强大的版本,@ jonrsharpe的答案是要走的路)。
答案 1 :(得分:1)
一般情况下,我会使用@property
来保护实例的value
属性,然后保护emulate a numeric type,而不是继承int
:
class SaturatedInteger(object):
"""Emulates an integer, but with a built-in minimum and maximum."""
def __init__(self, min_, max_, value=None):
self.min = min_
self.max = max_
self.value = min_ if value is None else value
@property
def value(self):
return self._value
@value.setter
def value(self, new_val):
self._value = min(self.max, max(self.min, new_val))
@staticmethod
def _other_val(other):
"""Get the value from the other object."""
if hasattr(other, 'value'):
return other.value
return other
def __add__(self, other):
new_val = self.value + self._other_val(other)
return SaturatedInteger(self.min, self.max, new_val)
__radd__ = __add__
def __eq__(self, other):
return self.value == self._other_val(other)
if __name__ == '__main__':
v = SaturatedInteger(0, 100)
v += 68719
assert v == 100
assert 123 + v == 100
我只实施了__add__
,__radd__
和__eq__
,但您可以看到其余内容是如何根据需要构建的。您可能想要考虑当两个SaturatedInteger
一起使用时会发生什么 - 如果结果有例如min(self.min, other.min)
作为自己的min
?
答案 2 :(得分:0)
我写了一个带有add函数的示例类:
}
100