这是one of my previous questions的延续
这是我的课程。
#Project class
class Project:
def __init__(self, name, children=[]):
self.name = name
self.children = children
#add object
def add(self, object):
self.children.append(object)
#get list of all actions
def actions(self):
a = []
for c in self.children:
if isinstance(c, Action):
a.append(c.name)
return a
#get specific action
def action(self, name):
for c in self.children:
if isinstance(c, Action):
if name == c.name:
return c
#get list of all projects
def projects(self):
p = []
for c in self.children:
if isinstance(c, Project):
p.append(c.name)
return p
#get specific project
def project(self, name):
for c in self.children:
if isinstance(c, Project):
if name == c.name:
return c
#Action class
class Action:
def __init__(self, name):
self.name = name
self.done = False
def mark_done(self):
self.done = True这就是我遇到的麻烦。如果我构建一个包含几个小项目的大项目,我想要查看项目是什么或当前项目的操作,但是我将它们都放在树中。下面是我正在使用的测试代码(请注意,我特意选择了几种不同的方式来添加项目和动作以进行测试,以确保不同的方式工作)。
life = Project("life")
playguitar = Action("Play guitar")
life.add(Project("Get Married"))
wife = Project("Find wife")
wife.add(Action("Date"))
wife.add(Action("Propose"))
wife.add(Action("Plan wedding"))
life.project("Get Married").add(wife)
life.add(Project("Have kids"))
life.project("Have kids").add(Action("Bang wife"))
life.project("Have kids").add(Action("Get wife pregnant"))
life.project("Have kids").add(Project("Suffer through pregnancy"))
life.project("Have kids").project("Suffer through pregnancy").add(Action("Drink"))
life.project("Have kids").project("Suffer through pregnancy").add(playguitar)
life.add(Project("Retire"))
life.project("Retire").add(playguitar)生活中应该有几个项目,其中有几个项目。这个结构就像这样(缩进是项目,-是动作)
Life
Get Married
Find wife
- Date
- Propose
- Plan wedding
Have kids
- Bang wife
- Get wife pregnant
Suffer through pregnancy
- Drink
- Play guitar
Retire
- Play guitar我发现life.actions()返回树中的每个操作,而它应该返回none。当我只想“结婚”、“生孩子”和“退休”时,life.projects()返回每个项目,甚至是子项目。我到底做错了什么?
发布于 2009-07-25 01:29:29
问题出在项目的初始化上:
__init__(self, name, children=[]):您只获得一个列表,该列表由您创建的所有项目共享,而不传递子项的值。有关说明,请参阅here。相反,您希望将缺省值设置为None,并在值为None时初始化一个空列表。
__init__(self, name, children=None):
if children is None:
children = []https://stackoverflow.com/questions/1180876
复制相似问题