如果不遵循生成器功能,则要遵循最佳实践,则必须实现以下类似操作:
In [7]: class IterableContainer: ...: def __init__(self, data=(1,2,3,4,5)): ...: self.data = data ...: def __iter__(self): ...: return IterableContainerIterator(self.data) ...:In [8]: class IterableContainerIterator: ...: def __init__(self, data): ...: self.data = data ...: self._pos = 0 ...: def __iter__(self): ...: return self ...: def __next__(self): ...: try: ...: item = self.data[self._pos] ...: except IndexError: ...: raise StopIteration ...: self._pos += 1 ...: return item ...:In [9]: container = IterableContainer()In [10]: for x in container: ...: print(x) ...:12345
当然,以上示例是人为设计的,但希望您能理解。使用生成器,可以简单地是:
In [11]: class IterableContainer: ...: def __init__(self, data=(1,2,3,4,5)): ...: self.data = data ...: def __iter__(self): ...: for x in self.data: ...: yield x ...: ...:In [12]: list(IterableContainer())Out[12]: [1, 2, 3, 4, 5]
至于状态,恰恰是-对象可以具有状态,例如属性。您可以在运行时操纵该状态。您 可以 执行以下操作,但是我不建议这样做:
In [19]: class IterableContainerIterator: ...: def __init__(self, data): ...: self.data = data ...: self._pos = 0 ...: def __iter__(self): ...: return self ...: def __next__(self): ...: try: ...: item = self.data[self._pos] ...: except IndexError: ...: raise StopIteration ...: self._pos += 1 ...: return item ...: def rewind(self): ...: self._pos = min(0, self._pos - 1) ...:In [20]: class IterableContainer: ...: def __init__(self, data=(1,2,3,4,5)): ...: self.data = data ...: def __iter__(self): ...: return IterableContainerIterator(self.data) ...:In [21]: container = IterableContainer()In [22]: it = iter(container)In [23]: next(it)Out[23]: 1In [24]: next(it)Out[24]: 2In [25]: it.rewind()In [26]: next(it)Out[26]: 1In [27]: next(it)Out[27]: 2In [28]: next(it)Out[28]: 3In [29]: next(it)Out[29]: 4In [30]: next(it)Out[30]: 5In [31]: it.rewind()In [32]: next(it)Out[32]: 1



