您可以使用Python属性将规则明确地分别应用于每个字段,并且即使客户端代码尝试更改该字段也可以强制执行这些规则:
class Spam(object): def __init__(self, description, value): self.description = description self.value = value @property def description(self): return self._description @description.setter def description(self, d): if not d: raise Exception("description cannot be empty") self._description = d @property def value(self): return self._value @value.setter def value(self, v): if not (v > 0): raise Exception("value must be greater than zero") self._value = v任何违反规则的尝试都将引发异常,即使是在
__init__函数中,在这种情况下,对象构造也会失败。
更新: 从2010年到现在,我了解到
operator.attrgetter:
import operatorclass Spam(object): def __init__(self, description, value): self.description = description self.value = value description = property(operator.attrgetter('_description')) @description.setter def description(self, d): if not d: raise Exception("description cannot be empty") self._description = d value = property(operator.attrgetter('_value')) @value.setter def value(self, v): if not (v > 0): raise Exception("value must be greater than zero") self._value = v


