Python的迭代器和生成器总结(2)
第一篇中的testB有点偷懒,直接在一个类中同时实现了__iter__和__next__方法。但是听培训老师的意思,常用的方法应该是分2个类来做的。如下面代码所示。后面加注释的地方,都是需要关注的设计点。
import collections
class ClassMate(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
def __iter__(self):
return ClassIterator(self) #把自己放入迭代器中
class ClassIterator(object):
def __init__(self, obj):
self.obj = obj
self.current_num = 0 #实例属性,指定位置
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.obj.names):
ret = self.obj.names[self.current_num]
self.current_num += 1 #在返回之前把指针指向下一个位置
return ret
else:
raise StopIteration #通过异常来退出,避免不存在的None
classMate = ClassMate()
classMate.add("zhangsan")
classMate.add("lisi")
classMate.add("wangwu")
for name in classMate:
print(name)