首页 > 解决方案 > Python 类迭代器

问题描述

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

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

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

标签: pythoniterator

解决方案


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

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

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

推荐阅读