getter and setter and list appends

Diez B. Roggisch deets at nospam.web.de
Mon Apr 20 13:05:06 EDT 2009


dasacc22 wrote:

> Hi,
> 
> I seem to be having a problem with a list being share across multiple
> instantiations of it and dont quite understand why this is happening.
> 
> My class looks like this,
> 
> class Widget(object):
>     _parent = None
>     _children = []
> 
>     def __init__(self, parent=None):
>         self.parent = parent
> 
>     @property
>     def children(self):
>         return self._children
> 
>     @property
>     def parent(self):
>         return self._parent
> 
>     @parent.setter
>     def parent(self, obj):
>         if obj:
>             obj._children.append(self)
>             self._parent = obj
> 
> 
> now if i make instances and attach children like so
> 
> a = Widget()
> b = Widget(a)
> c = Widget(a)
> d = Widget(c)
> 
> Basically all the objects end up sharing the _children list from `a`
> instead of forming something like a tree. Any advice would be greatly
> appreciated.

The problem stems from you confusing instance attributes with class
attributes. You use a latter, which is shared amongst *all* instances of a
given class.

If you want instance-attributes, use

def __init__(self, ..):
    self.children = []

also, your use of properties for the children is pointless in Python. Just
use "children" as attribute name. Then, if at one fine day you want to do
something more than just returning that value, you can still do that witout
changing the interface by using a property - as you do so for parent.

Diez



More information about the Python-list mailing list