实现装饰器来限制setter

时间:2014-12-10 14:37:24

标签: python oop

我有一个包含一些实例变量的类,我通过装饰有@someinstancevariable.setter装饰器的函数设置它们。我如何确保设置的值具有可设置的最大值和最小值?我是否需要为此设置多个装饰器,或者是否有某些方法可以使用常规@someinstancevariable.setter装饰器并覆盖它?

1 个答案:

答案 0 :(得分:3)

请注意,property实际上是descriptor的具体实现,您可以自己推送:

class ValidRange(object):

    def __init__(self, name, min_, max_):
        self._min = min_
        self._max = max_
        self._name = name

    def __get__(self, instance, owner):
        return getattr(instance, self._name)

    def __set__(self, instance, value):
        setattr(instance, self._name, min(self._max, max(value, self._min)))

    def __delete__(self, instance):
        delattr(instance, self.name)

这将用作:

>>> class Weather(object):
...     temperature = ValidRange('_temp', 0, 100)
... 
>>> w = Weather()
>>> w.temperature = 120
>>> w.temperature
100

我发布了一个更具有自动性name的设置描述符方法here - 设置......