为什么 return self 在自定义迭代器中?

Why return self in a custom iterator?

我是 python 的新手(不是编码),我正在使用该语言使用迭代器。当我们构建迭代器时,我了解如何它们工作以及如何构建自定义迭代器,但我不理解为什么我们return self__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>

我的问题是类型不应该是某个迭代器(例如列表有 list_iterator)。是否必须扩展其他一些 class?

__iter__ 使某些东西可迭代。它 return 是一个迭代器,但它不是迭代器本身。有两种迭代方法。一个对象可以是它自己的迭代器

>>> fileobj = open("test.txt")
>>> iter(fileobj) == fileobj
True
>>> print(type(fileobj), type(iter(fileobj)))
<class '_io.TextIOWrapper'> <class '_io.TextIOWrapper'>

或者它可以return一个不同的对象来处理迭代

>>> listobj = []
>>> iter(listobj) == listobj
False
>>> print(type(listobj), type(iter(listobj)))
<class 'list'> <class 'list_iterator'>

你returnself如果你想让对象的所有迭代器迭代同一个东西。这就是您想要的一个在幕后进行顺序访问的文件。但是对于列表,您希望每个迭代器再次从顶部开始,因此每次都会创建一个新的 list_iterator 对象来做到这一点。

迭代器通常 returns self 所以再次调用 iter() 是安全的(直接或间接由于 for 循环或列表理解或其他东西)。

尽管您的情况可能有特定原因,但重置自身 (self.n = 0) 的迭代器并不是您想要的。一旦你得到一个迭代器,再次调用 iter() 不应该改变它。