Thanks, Peter. I was trying to avoid the regenerate step for updating. But maybe I can restructure my code and objects to make this simpler. Before that I'll try this view approach. Thanks again Ze
On Fri, Jan 18, 2013 at 11:37 AM, Peter Otten <__pete...@web.de> wrote: > Jose Amoreira wrote: > > > Hello > > Suppose I have a list l_obj of similar objects. Is there any way I can > > generate a list l_prp of references to a given property of those objects > > in such a way that, if change the value of one element in l_prp, the > > corresponding object in l_obj gets its property updated, and vice-versa? > > Let give an example of what I have in mind. > > > > In [1]: class MyCls(object): > > > > ...: def __init__(self,a): > > > > ...: self.prp = a > > > > ...: > > > > In [2]: l_obj = [MyCls(float(i)) for i in range(3)] > > > > In [3]: l_prp = [item.prp for item in l_obj] > > > > In [4]: for ob in l_obj: > > > > ...: print ob.prp, > > > > ...: > > > > 0.0 1.0 2.0 > > > > In [5]: l_prp > > > > Out[5]: [0.0, 1.0, 2.0] > > > > In [6]: l_prp[1]=5. > > > > In [7]: l_obj[1].prp > > > > Out[7]: 1.0 > > > > As expected, changes in l_prp do not change the properties of the > elements > > in l_obj, neither do changes in l_obj's element's properties change the > > values in l_prp. > > > > Is there a simple way to implement such connections? > > No. You'd need something like the observer pattern (listeners in Java), > where the class owning the property (MyCls) has to cooperate. The > administrative overhead is relatively high. > > The pythonic way is to regenerate the l_prp list every time you need an up- > to-date overview of the current values. > > An intermediate approach is to turn l_prp into a view on the l_obj list: > > from collections import Sequence > > class A(object): > def __init__(self, attrib): > self.attrib = attrib > > class AttribView(Sequence): > def __init__(self, items): > self._items = items > def __getitem__(self, index): > return self._items[index].attrib > def __len__(self): > return len(self._items) > def __repr__(self): > return repr(list(self)) > > items = [A(c) for c in "abcde"] > attribs = AttribView(items) > print attribs > items[1].attrib = 42 > print attribs > > > _______________________________________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > http://mail.python.org/mailman/listinfo/tutor >
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor