3

これは私の以前の質問の続きです

これが私のクラスです。

#Project class     
class Project:
    def __init__(self, name, children=[]):
        self.name = name
        self.children = children
    #add object
    def add(self, object):
        self.children.append(object)
    #get list of all actions
    def actions(self):
        a = []
        for c in self.children:
            if isinstance(c, Action):
                a.append(c.name)
        return a
    #get specific action
    def action(self, name):
        for c in self.children:
            if isinstance(c, Action):
                if name == c.name:
                    return c
    #get list of all projects
    def projects(self):
        p = []
        for c in self.children:
            if isinstance(c, Project):
                p.append(c.name)
        return p
    #get specific project
    def project(self, name):
        for c in self.children:
            if isinstance(c, Project):
                if name == c.name:
                    return c

#Action class  
class Action:
    def __init__(self, name):
        self.name = name
        self.done = False

    def mark_done(self):
        self.done = True

これが私が抱えている問題です。いくつかの小さなプロジェクトで大きなプロジェクトを構築する場合、プロジェクトが何であるか、または現在のプロジェクトのアクションを確認したいのですが、それらすべてをツリーに表示しています。これが私が使用しているテストコードです (異なる方法が機能することを確認するために、テストするプロジェクトとアクションを追加するいくつかの異なる方法を意図的に選択したことに注意してください)。

life = Project("life")

playguitar = Action("Play guitar")

life.add(Project("Get Married"))

wife = Project("Find wife")
wife.add(Action("Date"))
wife.add(Action("Propose"))
wife.add(Action("Plan wedding"))
life.project("Get Married").add(wife)

life.add(Project("Have kids"))
life.project("Have kids").add(Action("Bang wife"))
life.project("Have kids").add(Action("Get wife pregnant"))
life.project("Have kids").add(Project("Suffer through pregnancy"))
life.project("Have kids").project("Suffer through pregnancy").add(Action("Drink"))
life.project("Have kids").project("Suffer through pregnancy").add(playguitar)

life.add(Project("Retire"))
life.project("Retire").add(playguitar)

人生にはいくつかのプロジェクトがあり、その中にいくつかのプロジェクトがあるはずです。構造は次のようになります (インデントはプロジェクトで、- はアクションです)。

Life
    Get Married
        Find wife
            - Date
            - Propose
            - Plan wedding
    Have kids
        - Bang wife
        - Get wife pregnant
        Suffer through pregnancy
            - Drink
            - Play guitar
    Retire
        - Play guitar

私が見つけたのは、 life.actions() がツリー内のすべてのアクションを返すはずなのに、何も返さないということです。life.projects() は、「結婚する」、「子供を持つ」、「退職する」だけが必要な場合に、サブプロジェクトを含むすべてのプロジェクトを返します。私が間違っているのは何ですか?

4

1 に答える 1

5

問題は、プロジェクトの初期化にあります:

 __init__(self, name, children=[]):

子の値を渡さずに、作成するすべてのプロジェクトで共有されるリストを 1 つだけ取得します。説明については、こちらを参照してください。代わりにデフォルトの None を作成し、値が None の場合は常に空のリストを初期化します。

 __init__(self, name, children=None):
    if children is None:
       children = []
于 2009-07-25T01:29:29.080 に答える