算術演算が適用された後、指定された範囲内の値を制限するオブジェクトを実装したいと思います。以下のコードは正常に機能しますが、メソッドを無意味に書き直しています。確かに、これを行うためのよりエレガントな方法があります。メタクラスは進むべき道ですか?
def check_range(_operator):
def decorator1(instance,_val):
value = _operator(instance,_val)
if value > instance._upperbound:
value = instance._upperbound
if value < instance._lowerbound:
value = instance._lowerbound
instance.value = value
return Range(value, instance._lowerbound, instance._upperbound)
return decorator1
class Range(object):
'''
however you add, multiply or divide, it will always stay within boundaries
'''
def __init__(self, value, lowerbound, upperbound):
'''
@param lowerbound:
@param upperbound:
'''
self._lowerbound = lowerbound
self._upperbound = upperbound
self.value = value
def init(self):
'''
set a random value within bounds
'''
self.value = random.uniform(self._lowerbound, self._upperbound)
def __str__(self):
return self.__repr__()
def __repr__(self):
return "<Range: %s>" % (self.value)
@check_range
def __mul__(self, other):
return self.value * other
@check_range
def __div__(self, other):
return self.value / float(other)
def __truediv__(self, other):
return self.div(other)
@check_range
def __add__(self, other):
return self.value + other
@check_range
def __sub__(self, other):
return self.value - other