2009-07-25 15 views
3

Ceci est la suite de one of my previous questionsmodèle composite pour l'application GTD

Voici mes classes.

#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 

Voici le problème que j'ai. Si je construis un grand projet avec plusieurs petits projets, je veux voir ce que sont les projets ou les actions pour le projet en cours, mais je les trouve tous dans l'arborescence. Voici le code de test que j'utilise (notez que j'ai volontairement choisi plusieurs façons d'ajouter des projets et des actions à tester pour m'assurer que différentes méthodes fonctionnent).

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) 

vie devrait avoir quelques projets en elle, avec quelques projets à l'intérieur de ceux-ci. La structure revient à quelque chose comme ceci (où sont les projets et tirets -Bois sont des actions)

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 

Ce que je trouve que life.actions() est de retour chaque action dans l'arbre quand il doit retourner aucun . life.projects() renvoie tous les projets, même les sous-projets, quand je veux seulement «se marier», «avoir des enfants» et «prendre sa retraite». Qu'est-ce que je fais de mal?

+0

Bons exemples. Maintenant, je sais quoi faire quand ma femme tombe enceinte une deuxième fois. Boire et jouer de la guitare. Je dois l'écrire dans mon outil de capture GTD. :) –

Répondre

5

Le problème est avec votre initialisation des projets:

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

Vous obtenez seulement une liste, qui est partagée par tous les projets que vous créez sans passer une valeur pour les enfants. Voir here pour une explication. Vous souhaitez à la place définir la valeur par défaut None et initialiser une liste vide chaque fois que la valeur est None.

__init__(self, name, children=None): 
    if children is None: 
     children = []