基于Python的简单GTD应用程序类

2024-09-29 19:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为自己编写一个非常初级的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

每个项目都有对它的操作,但是我想使它这样的项目也可以由其他项目组成。比如说每天我都想打印一份清单。我很难想出一个像这样的列表

^{pr2}$

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

我已经能够获取项目并将它们添加到Project类中的actions属性中,但是之后我遇到了什么情况大型项目.actions.action.行动。行动情况开始出现。在

如果有人能帮助解决班级结构的问题,我们将不胜感激!在


Tags: 项目代码nameselfprojectactions应用程序init
3条回答

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

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)

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

^{pr2}$

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

如果你想要一个方法来获取树中所有叶节点的平面列表(Actions),你可以在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

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

例如,您可以将一个项目类(抽象)、一个ProjectComposite类(concrete)和您的action类作为一个叶。在

你评估过现有的GTD工具吗?我将研究现有GTD工具使用的文件格式,特别是那些保存为XML的工具。这会让你知道组织这类数据的方法是可行的。在

结构从相当简单的(任务文件)到巴洛克风格(全方位聚焦)。环顾四周,了解别人在你之前做了什么。在

相关问题 更多 >

    热门问题