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