我有一个创建多重链表的类。每个节点可以有几个(或一个或没有)子节点。该节点具有指向其最新子节点的指针,并且每个子节点都具有指向其前一个兄弟节点的指针。因此,我可以依次采取每个最新的孩子,然后是每个兄弟姐妹,走完整棵树。这个功能成功地完成了三个,但没有做任何有用的事情:
def walk_the_tree(self):
if not self.latestChild is None:
self.latestChild.walk_the_tree()
if not self.sib is None:
self.sib.walk_the_tree()
现在,我真正想做的是传递某种参数,以便可以在每个节点上执行成员函数。这是一些不会编译的东西,但我希望它能像我想要的一样:
def walk_the_tree(self, fcn):
self.fcn()
if not self.latestChild is None:
self.latestChild.walk_the_tree()
if not self.sib is None:
self.sib.walk_the_tree()
因此,fcn可以是,例如,只有类__repr__
,所以我可以快速获得所有节点上的所有信息。或者它可能是create_new_child()
,它将决定节点是否需要新的子节点,如果是,则创建它。我希望用户能够在不依赖某种旗帜的情况下选择它。例如,我不想的内容类似于:
def walk_the_tree(self, fcnflg):
if (fcnflg == 1): self.__repr__()
if (fcnflg == 2): self.create_new_child()
if not self.latestChild is None:
self.latestChild.walk_the_tree()
if not self.sib is None:
self.sib.walk_the_tree()
有什么办法吗?
答案 0 :(得分:1)
问题是您使用的是self.fcn
,但未定义。只需使用fcn
即可。这是一个人为的例子:
>>> class MyContainer(object):
... def __init__(self, iterable=None):
... if iterable is not None:
... self.data = list(iterable)
... else:
... self.data = []
... def walk_container(self, f):
... for x in self.data:
... print(f(x))
... def _increment(self, x):
... return x + 1
... def print_increments(self):
... self.walk_container(self._increment)
...
>>> c = MyContainer([0,1,2])
>>> c.print_increments()
1
2
3
>>>
或者如果您愿意,可以在外部使用非方法:
>>> c.walk_container(lambda x: x**2)
0
1
4
>>>