Python类简单的GTD应用(Python classes for simple GTD app)

2019-07-30 17:01发布

我想为自己编写一个非常基本的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

这是很清楚,我认为递归将被使用。 我与是否要创建一个名为子项目和子类项目给它另一个类挣扎。 有些东西只是让我的大脑引发异常。

我已经能够承担的项目,并将它们添加到行动项目类的属性,但是随后我跑到哪里MegaProject.actions.action.actions.action情况开始雨后春笋般冒出来。

如果有人可以帮帮忙,用类结构,这将不胜感激!

Answer 1:

您可以创建一个子项目成员,类似于你的行动清单,并指派项目,它以类似的方式。 项目没有子类是必要的。

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

他们在这里的关键是,这些项目有相同的接口操作(使用add除外/删除方法)。 这允许递归调用在整个树的方法。 如果你有一个复杂的嵌套结构,你可以调用顶层的方法,并把它过滤跌到了谷底。

如果你想一个方法来获得树(操作)所有叶子节点的平面列表可以实现在项目类这样的方法。

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


Answer 2:

我建议你看一下复合模式可以应用到“项目”级。 如果你正确地使你的结构,你应该能够做出的动作是树的叶子,很像你在你所描述的。

你可以,例如,做一个工程类(abstract),一个ProjectComposite类(concrete)和Action类的叶子。



Answer 3:

您已经评价现有的GTD工具? 我想看看现有GTD工具使用的文件格式,ESP。 那些保存为XML。 这会给你一个想法,哪些数据往往工作的方式来组织这样的。

结构范围从相当简单(TaskPaper)巴洛克(OmniFocus中)。 环顾四周,并了解其他人你以前那样。



文章来源: Python classes for simple GTD app