2009-07-09 6 views
0

Моя проблема заключается в:питон, как создавать различные экземпляры одного и того же класса в итерационной

Я хотел бы добавить к композитному классу объектов Leaf, созданных во время выполнения внутри составного рутина, как это:

def update(self, tp, msg, stt): 
    """It updates composite objects 
    """ 
    d = Leaf() 
    d.setDict(tp, msg, stt) 
    self.append_child(d) 

    return self.status() 

Внутри главной:

import lib.composite 
c = Composite() 
for i in range(0,10): 
    c.update(str(i), msg, stt) 

и композит:

class Composite(Component): 
    def __init__(self, *args, **kw): 
     super(Composite, self).__init__() 
     self.children = [] 

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

    def update(self, tp, msg, stt): 
     d = Leaf() 
     d.setDict(tp, msg, stt) 
     self.append_child(d) 
     return self.status() 

    def status(self): 
     for child in self.children: 
      ret = child.status() 
      if type(child) == Leaf: 
       p_out("Leaf: %s has value %s" % (child, ret)) 

class Component(object): 
    def __init__(self, *args, **kw): 
     if type(self) == Component: 
      raise NotImplementedError("Component couldn't be " 
             "instantiated directly") 

    def status(self, *args, **kw): 
     raise NotImplementedError("Status method " 
            "must be implemented") 

class Leaf(Component): 

    def __init__(self): 
     super(Leaf, self).__init__() 
     self._dict = {} 

    def setDict(self, type, key, value) 
     self._dict = { type : { key : value } } 

    def status(self): 
     return self._dict 

Но таким образом я всегда обнаружил, что мой композит имеет только один лист («d»), даже если обновление было вызвано много раз.

Как я могу кодировать такую ​​процедуру, чтобы иметь возможность заполнять композит во время выполнения?

+0

Можете ли вы привести полный пример программы, демонстрирующей эту проблему? –

+0

Возможно, self.append_child всегда помнит последний? – sunqiang

+0

@Greg: добавлен некоторый код (надеюсь, полезно) – DrFalk3n

ответ

0

Что делает append_child? Я думаю, что он должен хранить листья в списке. Имеет ли это?

Обновление: вы не должны передавать self в качестве первого аргумента в основной функции. Я думаю, что это вызывает исключение.

См ниже код, который, кажется, работает нормально

 
class Component(object): 
    def __init__(self, *args, **kw): 
     pass 

    def setDict(self, *args, **kw): 
     pass 

class Leaf(Component): 
    def __init__(self, *args, **kw): 
     Component.__init__(self, *args, **kw) 

class Composite(Component): 
    def __init__(self, *args, **kw): 
     Component.__init__(self, *args, **kw) 
     self.children = [] 

    def update(self, tp, msg, stt): 
     """It updates composite objects 
     """ 
     d = Leaf() 
     d.setDict(tp, msg, stt) 
     self.append_child(d) 

     return 0 

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

    def remove_child(self, child): 
     self.children.remove(child) 

c =Composite() 
for i in range(0,10): 
    c.update(str(i), "", 0) 
print len(c.children) 
+0

да что он делает – DrFalk3n

+0

@Luc: исправлено Это было просто вырезано и вставляется ошибка – DrFalk3n

3

«Но таким образом я всегда считал, что мой композит имеет только один лист (» D «) добавил, даже если обновление было множество раз.»

Нет, этот код делает Composite с десятью детьми.

>>> c.children 
[<__main__.Leaf object at 0xb7da77ec>, <__main__.Leaf object at 0xb7da780c>, 
<__main__.Leaf object at 0xb7da788c>, <__main__.Leaf object at 0xb7da78ac>, 
<__main__.Leaf object at 0xb7da78cc>, <__main__.Leaf object at 0xb7da792c>, 
<__main__.Leaf object at 0xb7da794c>, <__main__.Leaf object at 0xb7da798c>, 
<__main__.Leaf object at 0xb7da79ac>, <__main__.Leaf object at 0xb7da79cc>] 

Итак, почему вы думаете, что это только странно.

+0

«Mumble Mumble» дайте мне подумать и сделать пробную версию, но я действительно не знаю этого странного поведения – DrFalk3n

+0

ok мой основной был внутри плохо используемого синглетонического класса. Принести извинения!!! Я предлагаю удалить этот вопрос – DrFalk3n

+0

@ DrFalk3n, вы должны удалить свой вопрос (используя небольшую ссылку «Удалить» под меткой [s]). –

Смежные вопросы