В дереве узлов parent.addChild (self) добавляет себя в self - PullRequest
0 голосов
/ 20 апреля 2011

Я строю простое дерево узлов в Python. Но когда мой конструктор пытается добавить текущий узел как дочерний элемент данного родителя, текущий узел также добавляет себя как дочерний элемент.

Вот мой метод конструктора (и создание children):

children = []

def __init__(self, parent=None, tag="[ROOT]", attrs=None):
        self.parent = parent
        self.tag = tag
        self.attrs = attrs
        print "\n", "self:%s ... children:%s" % (self.tag, self.children)
        if parent != None:
            parent.addChild(self)
        print "self:%s ... children:%s" % (self.tag, self.children)

Вот мой метод addChild в том же классе (который должен вызываться для родителя, а не для строящегося узла):

def addChild(self, child):
        self.children.append(child)

Вот вывод:

foo []
foo [foo]

Две строки вывода должны быть одинаковыми, поскольку строка кода между ними должна влиять только на родительский узел, а не на строящийся в данный момент узел.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 20 апреля 2011

Когда вы инициализируете дочерние элементы на уровне класса, каждый экземпляр вашего класса в итоге разделяет один и тот же объект списка.

>>> class C:
...  children = []
... 
>>> a = C()
>>> b = C()
>>> id(a.children)
144349644
>>> id(b.children)
144349644

Попробуйте вместо этого инициализировать его в конструкторе:

def __init__(self, parent=None, tag="[ROOT]", attrs=None):
    self.children = []
0 голосов
/ 20 апреля 2011

Я подозреваю, что children каким-то образом используется всеми объектами вашего узла;мы не видим декларацию, поэтому я не могу точно сказать, что вы делаете неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...