首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单GTD应用程序的Python类

简单GTD应用程序的Python类
EN

Stack Overflow用户
提问于 2009-07-23 23:48:09
回答 3查看 1.1K关注 0票数 2

我正在尝试为自己编写一个非常初级的GTD应用程序,不仅是为了更有条理,也是为了更好地编码和更好地使用Python。然而,我在使用类时遇到了一些问题。

以下是我到目前为止所拥有的类:

代码语言:javascript
复制
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

每个项目都有相应的操作,但是我想让项目也可以由其他项目组成。比方说每天我都想打印出一张所有东西的清单。我想不出如何构建一个如下所示的列表

代码语言:javascript
复制
> 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 situations开始弹出的地方。

如果任何人能帮助解决类结构问题,我们将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-24 00:01:02

您可以创建子项目成员,类似于您的操作列表,并以类似的方式将项目分配给它。没有子类化的项目是必要的。

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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类中实现一个类似这样的方法。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2009-07-23 23:59:58

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

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

票数 0
EN

Stack Overflow用户

发布于 2009-07-28 06:44:49

您评估过现有的GTD工具吗?我会看看现有的GTD工具使用的文件格式,特别是。那些保存为XML的文件。这将使您了解组织此类数据的方法是否可行。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1175110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档