代码之家  ›  专栏  ›  技术社区  ›  mandroid

简单GTD应用程序的Python类

  •  2
  • mandroid  · 技术社区  · 15 年前

    我试图为自己编写一个非常基本的GTD应用程序,不仅是为了组织起来,而且是为了更好地编写代码,更好地使用Python。然而,我的课程有点问题。

    以下是我到目前为止的课程:

    class Project:
        def __init__(self, name, actions=[]):
            self.name = name
            self.actions = actions
        def add(self, action):
            self.actions.append(action)
    
    class Action:
        def __init__(self, do='', context=''):
            self.do = do
            self.context = context
    

    每个项目都有相应的操作,但是我希望这样做,这样项目也可以由其他项目组成。比如说每天我想打印一份所有东西的清单。我很难想出如何构建一个这样的列表

    > Project A
    >        Actions for Project A
    >     Project B
    >         Sub project A
    >             Actions for Sub project A
    >         Sub project B
    >             Actions for Sub project B
    >         Sub project C
    >             Sub sub project A
    >                 Actions for sub sub project A
    >             Sub sub project B
    >                 Actions for sub sub project B
    >             Actions for Sub project C
    >         Actions for Project B
    

    我很清楚将要使用递归。我正在为是否创建另一个名为SubProject的类和它的子类Project而挣扎。那里的一些东西只是让我的大脑产生了一个例外。

    我已经能够获取项目并将它们添加到Project类中的actions属性中,但是随后我遇到了MegaProject.actions.action.actions.actions.actions情况开始出现的地方。

    如果有人能在班级结构方面提供帮助,我们将不胜感激!

    3 回复  |  直到 15 年前
        1
  •  3
  •   sixthgear    15 年前

    您可以创建类似于操作列表的子项目成员,并以类似的方式为其分配项目。不需要对项目进行子类化。

    class Project:
        def __init__(self, name, actions=[], subprojects=[]):
            self.name = name
            self.actions = actions
            self.subprojects = subprojects
    
        def add(self, action):
            self.actions.append(action)
    
        def add_project(self, project)
            self.subprojects.append(project)
    

    更好的是,您可能想要实现一个复合模式,其中项目是复合的,操作是叶子。

    class Project:
        def __init__(self, name, children=[]):
            self.name = name
            self.children = children
    
        def add(self, object):
            self.children.append(object)
    
        def mark_done(self):
            for c in self.children:
                c.mark_done()
    
    class Action:
        def __init__(self, do):
            self.do = do
            self.done = False
    
        def mark_done(self):
            self.done = True
    

    def get_action_list(self):
        actions = []
        for c in self.children:
            if c.__class__ == self.__class__:
                actions += c.get_action_list()
            else:
                actions.append(c)
        return actions
    
        2
  •  0
  •   tomzx    15 年前

    我建议你看一下 composite pattern 可以应用于“Project”类。如果您正确地构建了您的结构,您应该能够使操作成为该树的一片叶子,就像您在示例中描述的那样。

    例如,您可以将一个项目类(抽象)、一个项目组合类(具体)和一个动作类作为一个叶子。

        3
  •  0
  •   Tadeusz A. Kadłubowski    15 年前

    推荐文章