2009-07-25 1 views
3

これは続きのone of my previous questionsGTDアプリのコンポジットパターン

ここは私のクラスです。

#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) 

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

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は()それはNoneを返す必要があり、ツリー内のすべてのアクションを返しているということである。このようなものになります。 life.projects()は、「Get Married」、「Have Have」、「Retire」だけを必要とするすべてのプロジェクト、サブプロジェクトさえも返しています。私が間違っているのは何ですか?

+0

良い例。今私は妻が二度目に妊娠したら何をすべきかを知っています。ドリンクとギターを弾く私のGTDキャプチャツールでそれを書き留めてください。 :) –

答えて

5

問題は、プロジェクトのあなたの初期化を使用することです:

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

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

__init__(self, name, children=None): 
    if children is None: 
     children = [] 
関連する問題