通过链接的对象列表传递函数

时间:2017-02-09 18:55:02

标签: python function object linked-list

我有一个创建多重链表的类。每个节点可以有几个(或一个或没有)子节点。该节点具有指向其最新子节点的指针,并且每个子节点都具有指向其前一个兄弟节点的指针。因此,我可以依次采取每个最新的孩子,然后是每个兄弟姐妹,走完整棵树。这个功能成功地完成了三个,但没有做任何有用的事情:

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()

有什么办法吗?

1 个答案:

答案 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
>>>