Python类迭代器

时间:2018-09-06 19:12:57

标签: python iterator

我有一个节点类,其中包含他的父节点,并想在其上创建迭代器。这是我的尝试:

class Node:
    def __init__(self, parent=None):
        self._parent = parent

    def __iter__(self):
        self = self.parent

    def __next__(self):
        if self.parent is None:
            raise StopIteration
        else:
            self = self.parent
            return self

但是当我尝试遍历实例时,它永远不会停止并返回相同的值,我做错了什么?

1 个答案:

答案 0 :(得分:5)

您的代码不起作用的原因是,您试图通过分配给self(这只是一个局部变量)来跟踪迭代器中的当前节点,因此实际上没有任何更新。 / p>

正确的方法是提取一个迭代器类并在那里跟踪当前节点:

class Node:
    def __init__(self, parent=None):
        self.parent = parent

    def __iter__(self):
        return NodeIterator(self)


class NodeIterator:
    def __init__(self, node):
        self.next_node = node

    def __iter__(self):
        return self

    def __next__(self):
        if self.next_node is None:
            raise StopIteration
        else:
            current_node = self.next_node
            self.next_node = self.next_node.parent
            return current_node

可以这样使用:

root = Node()

inner_1 = Node(root)
leaf_1 = Node(inner_1)

inner_2 = Node(root)
inner_2_1 = Node(inner_2)
leaf_2 = Node(inner_2_1)

for node in leaf_2:
    # will loop through:
    # leaf_2,
    # inner_2_1;
    # inner_2,
    # root