getter and setter and list appends

dasacc22 dasacc22 at gmail.com
Mon Apr 20 13:18:39 EDT 2009


Ah thank you for clarifying, I did confuse instance and class
attributes from creating the list in the class def. I actually just
spiffed up that class to represent a portion of a much larger class
that needs getter and setter for children. Doing as you said fixed my
problem, heres the code as reference for w/e

class Widget(object):
    _children = None
    _parent = None

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

    @property
    def children(self):
        return self._children

    @children.setter
    def children(self, obj):
        self._children = obj

    @property
    def parent(self):
        return self._parent

    @parent.setter
    def parent(self, obj):
        if obj:
            print obj
            obj.children.append(self)
            self._parent = obj


On Apr 20, 1:05 pm, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
> 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