Hello all, I've been using Python properties quite a lot lately and I've found a few things that are a bit annoying about them in some cases. I wondered if I missed something or if anybody else has this kind of problems too, and if there are better solutions than the ones I'm using ATM.
The first annoyance is when I want to specialize a property in a subclass. This happens quite often actually, and it is even sometimes the reason why a plain attribute is turned into a property: a subclass needs to do more things than the superclass when the property is updated for example. So, of course, my first try was: class A(object): def __init__(self): self._p = None def _get_p(self): return self._p def _set_p(self, p): self._p = p p = property(_get_p, _set_p) class B(A): def _set_p(self, p): ## Additional things here… super(B, self)._set_p(p) And of course, it doesn't work: the property has been bound to A._set_p in A, so any new definition of _set_p in any subclass does not replace the set method for the property. So I always have to add a line: p = property(A._get_p, _set_p) in the subclass too. This is a bit awkward to me, since I have to specify the superclass's name (super(…) can't be used, since it should take B as an argument, and B isn't defined yet…). Do I miss something? Is this the way to do it, or is there a better one? The second annoyance is when I have a property that is a list of something. I often have to do something when the contents of the list is modified. So basically, I often end up doing the following: def C(object): def __init__(self): self._l = [] def _get_l(self): return list(self._l) def _set_l(self, l): self._l = list(l) l = property(_get_l, _set_l) But then, I have to do: o = C() l = o.l l.append(42) o.l = l instead of just doing: o.l.append(42) which would seem much more natural IMHO. Is there any not too complicated way to have o.l.append(…) call something in C? And the same for o.l.remove(…), o.l[i] = …, and everything else updating the list contents? Thanks! - Eric - -- http://mail.python.org/mailman/listinfo/python-list