我正在尝试为自己编写一个非常初级的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 situations开始弹出的地方。
如果任何人能帮助解决类结构问题,我们将不胜感激!
发布于 2009-07-24 00:01:02
您可以创建子项目成员,类似于您的操作列表,并以类似的方式将项目分配给它。没有子类化的项目是必要的。
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-23 23:59:58
我建议你看看composite pattern,它可以应用于“项目”类。如果您正确地构建了结构,您应该能够使action成为树的一片叶子,就像您在示例中所描述的那样。
例如,你可以做一个项目类(抽象),一个ProjectComposite类(具体)和你的动作类作为一个叶子。
发布于 2009-07-28 06:44:49
您评估过现有的GTD工具吗?我会看看现有的GTD工具使用的文件格式,特别是。那些保存为XML的文件。这将使您了解组织此类数据的方法是否可行。
结构的范围从相当简单的(TaskPaper)到巴洛克(OmniFocus)。环顾四周,了解别人在你之前做了什么。
https://stackoverflow.com/questions/1175110
复制相似问题