我有一个节点类,其中包含他的父节点,并想在其上创建迭代器。这是我的尝试:
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
但是当我尝试遍历实例时,它永远不会停止并返回相同的值,我做错了什么?
答案 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