Multiple instances and wrong parental links

Josh English Joshua.R.English at gmail.com
Sat Jan 1 20:59:33 EST 2011


I have hit yet another wall. I am dynamically creating a class and then creating instances of that class. The class relies on a second class to store a list of objects. (This is simplified from the the original by a factor of about 20. The real program is trying to create a Python object around an XML definition object.)

Here's the code:

## OPTION ONE for class: ElementList
### Not really a list, but a wrapper that behaves like a list
class ElementList(object):
    def __init__(self, parent, name):
        self._parent = parent
        self._name = name

def MakeWrapper(checker, _addNameAsAttribute = False ):

    ## OPTION TWO for class: ElementList
    class Wrap(object):

        ## OPTION THREE for class: Elementlist

        def __init__(self, name):
            self._name = name
            setattr(Wrap, 'stuff', ElementList(self, 'test'))

    Wrap.__name__= checker.title()

    return Wrap

if __name__ == '__main__':

    Dude = MakeWrapper('Dude')
    print Dude
    d1 = Dude('Josh')
    print d1, d1.stuff

    # creating the second instance changes the behavior of the subclass
    d2 = Dude('Ben')
    print d2, d2.stuff
    print d1.stuff._parent
    print d2.stuff._parent

    #creating a third instance changes the behavior of all the subclasses
    d3 = Dude('David')
    print d3, d3.stuff
    print d1.stuff._parent, d2.stuff._parent, d3.stuff._parent

## END CODE

And here is the output:

>>> 
<class '__main__.Dude'>
<__main__.Dude object at 0x00DFB930> <__main__.ElementList object at 0x00DFB950>
<__main__.Dude object at 0x00DFB730> <__main__.ElementList object at 0x00DFB770>
<__main__.Dude object at 0x00DFB730>
<__main__.Dude object at 0x00DFB730>
<__main__.Dude object at 0x00DFB870> <__main__.ElementList object at 0x00DFB9B0>
<__main__.Dude object at 0x00DFB870> <__main__.Dude object at 0x00DFB870> <__main__.Dude object at 0x00DFB870>

The 'stuff' attribute is an ElementList object linked back to the parent instance, but every time I create an instance, every instance's 'stuff' links back to the last instance created.

I'm not sure why this is happening, or how to prevent it.

Any suggestions?



More information about the Python-list mailing list