1 from collections.abc import Iterable 2 from collections.abc import Iterator 3 4 # 判断是否是可迭代对象 5 print(isinstance([11, 22, 33], Iterable)) 6 7 class Classmate(object): 8 def __init__(self): 9 self.name = list() 10 11 def add(self, name): 12 self.name.append(name) 13 14 def __iter__(self): 15 """要使一个对象变成可迭代对象,必须调用这个方法""" 16 return ClassIterator(self) #将ClassIterator类实例化的一个对象当作返回值 17 18 19 class ClassIterator(): 20 21 def __init__(self, obj): 22 self.obj = obj.name 23 self.num = 0 24 def __iter__(self): 25 pass 26 27 def __next__(self): 28 if self.num <= len(self.obj): #设置if条件,让原来的for不会一直重复取同一个值 29 ret = self.obj[self.num] 30 self.num += 1 31 return ret 32 else: 33 raise StopIteration #抛出异常,for取数,如果没有这句话,for取完数后,会一直取__next__(self)返回的none 34 35 classmate = Classmate() 36 classmate.add("111") 37 classmate.add("222") 38 classmate.add("333") 39 40 print(isinstance(classmate, Iterable)) # 判断是否是可迭代对象 41 classmate_iterator = iter(classmate) #iter函数会自动调用classmate中的__iter__方法,取得其返回值,如果返回对象中有__next__(self)方法,则返回该对象的地址,否则报错 42 print(isinstance(classmate_iterator, Iterator)) #判断是否是迭代器 43 for x in classmate: 44 print(x) 45 46 ''' 47 最终版,将两个类合并 48 ''' 49 class Classmate(object): 50 def __init__(self): 51 self.name = list() 52 self.num = 0 53 def add(self, name): 54 self.name.append(name) 55 56 def __iter__(self): 57 """要使一个对象变成可迭代对象,必须调用这个方法""" 58 return self # 这里将自己的引用作为返回值,让人for循环会自动调用iter()函数,从这个引用里找到__next__(self)方法,执行 59 def __next__(self): 60 if self.num <= len(self.name ): # 设置if条件,让原来的for不会一直重复取同一个值 61 ret = self.name [self.num] 62 self.num += 1 63 return ret 64 else: 65 raise StopIteration # 抛出异常,for取数,如果没有这句话,for取完数后,会一直取__next__(self)返回的none