1

私の問題は次のとおりです。

次のように、実行時に Composite ルーチン内で作成された Composite クラス 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」) が 1 つしか追加されていないことが常にわかりました。

実行時にコンポジットを埋めることができるようなルーチンをどのようにコーディングできますか?

4

2 に答える 2

3

「しかし、この方法では、更新が何度も呼び出されたとしても、コンポジットにはリーフ ("d") が 1 つしか追加されないことが常にわかりました。」

いいえ、そのコードは Composite に 10 個の子を持たせます。

>>> 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>]

では、なぜ1つしかないと思うのかは奇妙です。

于 2009-07-09T11:27:46.587 に答える
1

append_child は何をしているのですか? 葉をリストに保存する必要があると思います。そうですか?

更新: main 関数の最初の引数として self を渡すべきではありません。例外が発生すると思います。

正常に動作するように見える以下のコードを参照してください

クラスコンポーネント(オブジェクト):
    def __init__(self, *args, **kw):
        合格

    def setDict(self, *args, **kw):
        合格

クラスリーフ(コンポーネント):
    def __init__(self, *args, **kw):
        Component.__init__(self, *args, **kw)

クラスコンポジット(コンポーネント):
    def __init__(self, *args, **kw):
        Component.__init__(self, *args, **kw)
        self.children = []

    デフォルト更新 (自己、tp、msg、stt):
        """複合オブジェクトを更新します
        """
        d = 葉 ()
        d.setDict(tp、msg、stt)
        self.append_child(d)

        0 を返す

    def append_child (自己、子):
        self.children.append(子)

    def remove_child(自己、子):
        self.children.remove(子)

c =コンポジット()
i の範囲 (0,10):
    c.update(str(i), "", 0)
print len(c.children)
于 2009-07-09T09:58:12.413 に答える