detecting property modification

Mangabasi mangabasi at gmail.com
Fri Dec 21 13:30:31 EST 2007


On Dec 21, 1:11 pm, Jean-Paul Calderone <exar... at divmod.com> wrote:
> On Fri, 21 Dec 2007 09:49:51 -0800 (PST), Mangabasi <mangab... at gmail.com> wrote:
> > [snip]
>
> >Hi Jean-Paul,
>
> >Sorry, I should have spelled this out in my post but I did not.  For
> >several reasons I do not wish to couple the pos object with the Body
> >instances.  In my case, I did not want pos objects (in my example they
> >were lists but they can be other objects as well) to care about their
> >parents.  So the question is:  How do we detect this in the Body?
>
> You can't.  If you have this:
>
>     b = Body([1, 2])
>     b.pos[0] = 3
>
> Then Body gets asked for the value of the attribute; then, that
> object (a list in the case of this example) gets told to change
> its 0th element to 3.  There is no way for Body to get in the
> way of the second message, except by doing what I said - adding
> a wrapper around the list so that it _can_ get in the way.
>
> This doesn't require the list to know anything about Body, though.
> _Body_ should apply the wrapper.
>
> For example, new-style:
>
>     class Body(object):
>         def get_pos(self):
>             return ChangeNoticingListWrapper(self._pos)
>         def set_pos(self, value):
>             self._pos = value
>         pos = property(get_pos, set_pos)
>         def __init__(self, pos):
>             self.pos = pos
>
>     class ChangeNoticingListWrapper(object):
>         def __init__(self, wrapped):
>             self.wrapped = wrapped
>         def __setitem__(self, index, value):
>             print 'Changing', index, 'to', value
>             self.wrapped[index] = value
>
>     b = Body([1, 2])
>     b.pos[0] = 3
>
> Jean-Paul


Hi Jean-Paul,

I see what you are saying but my contrived example is not doing a good
job explaining the real issue I am having here.

When you say "The Body gets asked for the value of the attribute" that
means that Body's __dict__ is being asked to provide a value
corresponding to its 'pos' key, right?  Now I may want to ask a more
specific question here.  How do I modify Body's __dict__ so that I can
perform a task when __getitem__ method of the __dict__ is called?



More information about the Python-list mailing list