You can use Python properties to cleanly apply the rules to each field separately and apply them even when client code tries to change the field:
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
An exception will be made for any attempt to violate the rules even in the __init__ function, in which case the object construction will fail.
UPDATE:. Somewhere between 2010 and now I found out about operator.attrgetter :
import operator class 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
Marcelo Cantos May 13 '10 at 9:16 a.m. 2010-05-13 09:16
source share