0

このコードでは:

# coding=utf-8


def print_tree(node, tree=0):
    print(u"|---" * tree + u"-> %s" % node)
    for kid in node.children:
        print_tree(kid, tree + 1)


class Person(object):
    parent = None
    first_name = None
    last_name = None
    children = []

    def __str__(self):
        return '%s %s' % (self.first_name, self.last_name)

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

    def __init__(self, first_name, last_name, parent=None):
        if parent is not None:
            if not isinstance(parent, Person):
                raise AttributeError('`parent` is not `Person` type!')
            self.parent = parent
            self.parent.children.append(self)
        self.first_name = first_name
        self.last_name = last_name
        #self.children = []


root = Person('Alan', 'Smith')
p1 = Person('Barbara', 'Smith', root)
p2 = Person('Basia', 'Smith', root)
p3 = Person('Bary', 'Smith', root)

print_tree(root)

例からコメントを削除すると正常に#self.children = []動作します。しかし、なぜこの行を追加する必要があるのか​​ わかりません。

self.parent.children.append(self)デバッガーで、行が追加されることselfも発見しましたself.children

なんで ?

4

4 に答える 4

2

childrenはクラス属性であり、インスタンス属性にする必要があります。クラス スコープから完全に削除し、メソッドchildren=[]内の 1 つだけを残す必要があります。__init__

于 2013-02-21T15:28:18.260 に答える
1

Python では、クラス レベルで属性を宣言すると、それがクラス属性になります (クラスのすべてのインスタンス間で共有されます)。あなたの場合、インスタンス属性が必要です。インスタンス属性は、コンストラクター ( your ) で作成する必要がありますself.children = []

于 2013-02-21T15:27:54.543 に答える
0

コード内childrenではclass variable(インスタンス レベルではなく、クラス レベルでアクセスすると参照される) がinstance variable(インスタンスごとに一意である) ではないため、問題が発生します。

したがって、次のようなものを追加する必要があります。

self.children = []

__init__あなたのインスタンスのたびにPerson

于 2013-02-21T15:27:55.980 に答える
0

オブジェクトインスタンスから子を参照しているため、クラススコープ/レイヤーだけに保持することはできません。そうself.children = []しないと、インスタンスの子ではなくクラスを参照しているためです。(後者の構文は次のようになりますPerson.children)

于 2013-02-21T15:28:04.250 に答える