2

我正在尝试为自己编写一个非常基本的 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.action 情况开始弹出的地方。

如果有人可以帮助解决类结构,将不胜感激!

4

3 回答 3

3

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

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

这里的关键是项目具有与操作相同的接口(添加/删除方法除外)。这允许递归地调用整个树上的方法。如果你有一个复杂的嵌套结构,你可以在顶层调用一个方法,然后让它过滤到底层。

如果您想要一种方法来获取树中所有叶节点的平面列表(操作),您可以在 Project 类中实现这样的方法。

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
于 2009-07-24T00:01:01.930 回答
0

我建议您查看可应用于“项目”类的复合模式。如果您的结构正确,您应该能够使动作成为那棵树的叶子,就像您在示例中描述的那样。

例如,你可以做一个 Project 类(抽象)、一个 ProjectComposite 类(具体)和你的动作类作为叶子。

于 2009-07-23T23:59:57.563 回答
0

您是否评估过现有的 GTD 工具?我会看看现有 GTD 工具使用的文件格式,尤其是。那些保存到 XML 的。这将使您了解哪些组织此类数据的方法往往有效。

结构范围从相当简单的(TaskPaper)到巴洛克式的(OmniFocus)。环顾四周,了解其他人在你之前做了什么。

于 2009-07-28T06:44:48.583 回答