property collections

Robin Becker robin at jessikat.fsnet.co.uk
Mon May 21 17:48:17 EDT 2001


In article <6qlmnqfsrn.fsf at abnoba.intevation.de>, Bernhard Herzog
<bh at intevation.de> writes
>Robin Becker <robin at jessikat.fsnet.co.uk> writes:
...


This looks more interesting. The problem for me is that the actual items
are of a particular PropertyHolder class, but I think it's possible to
create these on the fly.

Thanks for the code.

>This seems to work without cyclic references:
>
>class ItemProxy:
>
>    def __init__(self, parent, index):
>        self.__dict__["_parent"] = parent
>        self.__dict__["_index"] = index
>
>    def __getattr__(self, attr):
>        return self._parent.get_attribute(self._index, attr)
>
>    def __setattr__(self, attr, value):
>        self._parent.set_attribute(self._index, attr, value)
>
>class Parent:
>
>    def __init__(self):
>        self.items = {}
>
>    def __getitem__(self, index):
>        return ItemProxy(self, index)
>
>    def set_attribute(self, index, attr, value):
>        item = self.items.get(index)
>        if item is None:
>            item = self.items[index] = {}
>        item[attr] = value
>
>    def get_attribute(self, index, attr):
>        item = self.items.get(index)
>        if item is not None and item.has_key(attr):
>            return item[attr]
>        return getattr(self, attr)
>
>
>Sample session:
>
>$ python1.5 -i itemproxy.py 
>>>> p = Parent()
>>>> p.a = 1
>>>> p.b = 2
>>>> p[1].a = 0.5
>>>> p[1].a
>0.5
>>>> p[1].b
>2
>>>> p[2].a
>1
>>>> p[2].b
>2
>>>> 
>
>
>The trick here is that the parent does not have any references to the
>objects returned by the __getitem__ method, so there are no cyclic
>references.
>
>

-- 
Robin Becker



More information about the Python-list mailing list