On Jan 28, 4:37 am, John O'Hagan <m...@johnohagan.com> wrote:
> On Tue, 27 Jan 2009, Reckoner wrote:
> > I'm not sure this is possible, but I would like to have
> > a list of  objects
>
> > A=[a,b,c,d,...,z]
>
> > where,  in the midst of a lot of processing I might do something like,
>
> > A[0].do_something_which_changes_the_properties()
>
> > which alter the properties of the object 'a'.
>
> > The trick is that I would like A to be mysteriously aware that
> > something about the  object 'a' has changed so that when I revisit A,
> > I will know that the other items in the list need to be refreshed to
> > reflect the changes in A as a result of changing 'a'.
>
> > Even better would be to automatically percolate the subsequent changes
> > that resulted from altering 'a' for the rest of the items in the list.
>
> [...]
>
> Interesting question.
>
> Maybe this is too simple for your purpose (or maybe just wrong!), but could
> you subclass list and give it an "update" method which keeps a dictionary of
> the state of its members and/or calls another method that makes the
> appropriate changes in the other members when a change occurs, something
> like:
>
> class SelfAwareList(list):
>
>     state_dict = {}
>
>     def update(self):
>         for i in self:
>             if i.state == 'some_condition':
>                 self.do_stuff_to_other_members()
>             self.state_dict[i] = i.state
>
>     def do_stuff_to_other_members(self):
>         print 'doing stuff...'
>
> ?
>
> You could manually call update() on the SelfAwareList instance after calling a
> method on a SelfAwareList member, or even build it into the members' methods
> so that it was automatic.
>
> HTH,
>
> John

Hi Reckoner & John O'Hagan,

Great thread, very interesting.

John, I haven't seen anything like your class that uses list instead
of object and refers to state directly (i.state in self).  Could you
elaborate?  Here would be my implementation of your idea:

class SelfAwareList2(object):

    def __init__(self, l):
        self.l = l
        self.changed = [False for element in l]

    def __str__(self):
        return str(self.l)

    def update(self, index, value):
        self.l[index] = value
        self.changed[index] = True

    def do_stuff_to_other_members(self):
        for i in self.changed:
            if i==False:
                self.l[i] += 1

Here you can print and whenever you update your list, self.changed
keeps track of what changed.  Later on you can call do_stuff_to_others
which in this case adds 1 to each other element.

I assume that your class replaces the awkwardness of l.update(0, 5)
with l[0] = 5, but I can't quite wrap my mind around it.

Luther.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to