implementing descriptors

Raymond Hettinger python at rcn.com
Fri Aug 14 08:34:16 CEST 2009


[David]
> I am new to Python and I have a question about descriptors.  If I have
> a class as written below, is there a way to use descriptors to be
> certain that the datetime in start is always before the one in end?
>
> class foo(object):
>    def __init__(self,a = None,b = None)
>       self.start = a
>       self.end = b
>
> from datetime import datetime
> c = datetime(2009,8,13,6,15,0)
> d = datetime(2009,8,14,12,0,0)
> afoo = foo(c,d)
>
> For instance, if the following code were run, I would like to instance
> of foo to switch the start and end times.
>
> afoo.start = datetime(2010,8,13,6,15,0)
>
> I was thinking of using the __set__ descriptor to catch the assignment
> and reverse the values if necessary, but I can't figure out how to
> determine which values is being set.

You're on the right track, but it is easier to use property() than to
write your own custom descriptor with __get__ and __set__.

class foo(object):
    def __init__(self,a = None,b = None):
        self._start = a
        self._end = b
    def get_start(self):
        return self._start
    def set_start(self, value):
        if self._end is None or value < self._end:
            self._start = value
        else:
            self._end = value
    start = property(get_start, set_start)
    def get_end(self):
        return self._end
    def set_end(self, value):
        if self._start is None or value > self._start:
            self._end = value
        else:
            self._start = value
    end = property(get_end, set_end)



Raymond




More information about the Python-list mailing list