Python类迭代器

kar*_*baq -1 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
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*eyn 5

你的代码不起作用的原因是你试图通过分配来跟踪迭代器中的当前节点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
Run Code Online (Sandbox Code Playgroud)

这可以这样使用:

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
Run Code Online (Sandbox Code Playgroud)