python - 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
但是当我尝试遍历实例时,它永远不会停止并返回相同的值,我做错了什么?
解决方案
您的代码不起作用的原因是您试图通过分配 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
推荐阅读
- javascript - ESLint 显示错误并建议使用 try...catch
- android - 如何使用 SavedStateHandle 作为参数正确创建应用程序 ViewModel
- html - 营业时间表
- mapbox - 从 Mapbox GL JS 矢量源获取/列出源层
- flutter - 从firebase获取数据以插入MultiSelectFormField(小部件)
- jmeter - 如何从服务器上传和运行 jmeter 脚本
- python - 我正在尝试使用 pytorch 库构建一个带有一个神经元的神经网络。它一直给我一个错误
- python - 卡在“列表索引必须是整数或切片,而不是元组”错误
- python - 为什么列表中的某些项目不会在迭代中打印?
- javascript - 当我写一个正确的单词时,我的 if 和 else 都会同时被执行