0

TreeStructure相互にリンクされた親オブジェクトと子オブジェクトを作成できる (TS) クラスをコーディングしています。すべての TS オブジェクトには、プロパティでm_parent制御される属性と、この親のすべての子を保持するリストがあります。子を親のリストに追加すると、その子も独自のリストに追加されますか? ここに私が持っているものがあります:parentchildrenchildrenchildren

ROOT = "__ROOT__"

class TreeStructure:

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

    @property
    def parent(self):
        '''Returns m_parent'''
        if hasattr(self, "m_parent"):
            return self.m_parent
        else:
            return None

    @parent.setter
    def parent(self, parent=ROOT):
        '''Sets m_parent'''
        if type(parent) == type(self):
            if self.parent:
                del self.parent
            self.m_parent = parent
            self.m_parent.children.append(self)
        elif parent == ROOT:
            if self.parent:
                del self.parent
            self.m_parent = ROOT
        else:
            raise TypeError("Parent's type %s did not match objects type %s"
                            %(type(parent), type(self)))

    @parent.deleter
    def parent(self):
        '''Deletes m_parent'''
        if self.parent:
            if self.parent != ROOT:
                self.m_parent.children.remove(self)
            del self.m_parent

そして、2 つの単純なオブジェクトを作成することで、動作するはずです。しかし、そうではありません。

a = TreeStructure()
b = TreeStructure(a)

問題は 25 行目に表示されself.m_parent.children.append(self)ます。その行の両側に印刷を追加すると、両方が表示されprint(self.m_parent.children)、追加行の前にprint(self.children)空のリストが印刷されます。[]追加行の後にプリントを追加すると、両方のプリントに が表示されますが[<__main__.TreeStructure object at 0x...>]、これは子ではなく親でのみ発生するはずです?

4

2 に答える 2

4

[]デフォルト値として使用しないでください。

>>> def bad(default=[]):
...     default.append(1)
...     print default
... 
>>> bad()
[1]
>>> bad()
[1, 1]
>>> bad()
[1, 1, 1]
>>> def good(default=None):
...     if default is None:
...             default = []
...     default.append(1)
...     print default
... 
>>> good()
[1]
>>> good()
[1]

デフォルトの引数は、関数が呼び出されたときではなく、関数が定義されたときに作成されます。したがって、デフォルトには可変でない型のみを使用してください。整数、文字列、タプルを使用しても問題ありませんが、デフォルトのリストや辞書、または変更可能なものが必要な場合は、上記のトリックを使用して実行してください。None

この問題をよりよく理解するには、この質問と回答をお読みください。

于 2012-11-17T13:52:19.603 に答える
-2

古いスタイルのクラス (s などの記述子をサポートしていない@property) に気付きました。以下を使用する必要があります。

class TreeStructure(object):

それをした後、あなたのコードは私のために働きます

編集:

私はpython 2.7を使ってテストしています。3.x では、すべてのクラスが新しいスタイルです。

于 2012-11-17T13:51:16.293 に答える