作者:奋斗兵 | 来源:互联网 | 2022-12-05 15:15
我有一个包含其父级的节点类,并希望在其上创建迭代器.这是我的尝试:
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> Mikhail Burs..:
你的代码不起作用的原因是你试图通过分配来跟踪迭代器中的当前节点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