第七节 可迭代对象

 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
原文地址:https://www.cnblogs.com/kogmaw/p/12575488.html