在python中创建饱和整数的最佳方法?

时间:2015-05-12 17:13:58

标签: python-2.7

在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类型,但是在那里应该实现饱和逻辑呢?

3 个答案:

答案 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