如何解决为什么要在自定义迭代器中返回self?
我是python(不是编码)的新手,并且正在使用该语言的迭代器。当我们构建迭代器时,我了解它们是如何工作的以及如何构建自定义迭代器,但是我不理解我们在{{1}中return self
的{strong>为什么功能。
这是一个例子:
__iter__(self)
如果我执行以下操作:
class Cube_Pow:
def __init__(self,max = 0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
cube = self.n ** 3
self.n += 1
return cube
else:
raise StopIteration
我的问题是类型不应该是某个迭代器(例如,列表具有cubes = Cube_Pow(10)
cube_iter = iter(cubes)
print(cube_iter) #output: <__main__.Cube_Pow object at 0x1084e8cd0>
)。是否需要扩展其他课程?
解决方法
__iter__
使事物变得可迭代。它返回一个迭代器,但不是迭代器本身。有两种迭代方法。一个对象可以是自己的迭代器
>>> fileobj = open("test.txt")
>>> iter(fileobj) == fileobj
True
>>> print(type(fileobj),type(iter(fileobj)))
<class '_io.TextIOWrapper'> <class '_io.TextIOWrapper'>
或者它可以返回其他对象来处理迭代
>>> listobj = []
>>> iter(listobj) == listobj
False
>>> print(type(listobj),type(iter(listobj)))
<class 'list'> <class 'list_iterator'>
如果您希望对象的所有迭代器都迭代同一件事,则返回self
。这就是您要对文件进行后台访问的文件所需要的。但是对于列表,您希望每个迭代器都从顶部重新开始,因此每次都会创建一个新的list_iterator
对象。
迭代器通常返回self
,因此可以安全地再次调用iter()
(由于for
循环或列表理解等原因而直接或间接)。
尽管您的情况可能有特定原因,但您不希望自己进行迭代器重置(self.n = 0
)。一旦获得迭代器,就不要再对其调用iter()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。