方法1:
1 import time
2 from collections import Iterable
3 from collections import Iterator
4
5
6 class Classmate(object):
7
8
9 def __init__(self):
10 self.names = list()
11
12
13 def add(self,name):
14 self.names.append(name)
15
16
17 def __iter__(self):
18 """如果想要一个对象变成一个可以迭代的对象,即可以使用for,那么必须实现__iter__方法"""
19 return Classmator(self); # 调用Classmator 然后把自己传过去
20
21
22 class Classmator(object):
23 def __init__(self,obj):
24 self.obj = obj
25 # 定义索引值
26 self.current_num = 0
27
28 def __iter__(self):
29 pass
30
31
32 def __next__(self):
33 # 判断索引值是否超出列表个数范围
34 if self.current_num < len(self.obj.names):
35 ret = self.obj.names[self.current_num]
36 # 索引值+1
37 self.current_num += 1
38 return ret
39 else:
40 # 抛出异常,终止for循环
41 raise StopIteration
42
43 classmate = Classmate()
44
45 classmate.add("张三")
46 classmate.add("张二")
47 classmate.add("李四")
48
49 # 判断一个类型是否可以迭代 isinstance(要判断的对象,Iterable)
50 print("判断classmate是否是可以迭代的对象:", isinstance(classmate,Iterable))
51 # 迭代器
52 classmate_iterator = iter(classmate)
53 # 判断classmate_iterator是否是迭代器
54 print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator,Iterator))
55 # print(next(classmate_iterator))
56
57 for name in classmate:
58 print(name)
59 time.sleep(1)
两个类可以改善成一个,只要有__iter__方法和__next__方法:
1 import time
2 from collections import Iterable
3 from collections import Iterator
4
5
6
7 class Classmate(object):
8 def __init__(self):
9 self.names = list()
10 self.current_num = 0
11
12 def add(self,name):
13 self.names.append(name)
14
15
16 def __iter__(self):
17 return self
18
19
20 def __next__(self):
21 if self.current_num < len(self.names):
22 ret = self.names[self.current_num]
23 self.current_num += 1
24 return ret
25 else:
26 raise StopIteration
27
28
29 classmate = Classmate()
30 classmate.add("张三")
31 classmate.add("李四")
32 classmate.add("王五")
33
34 # 判断一个类型是否可以迭代 isinstance(要判断的对象,Iterable)
35 print("判断classmate是否是可以迭代的对象:", isinstance(classmate,Iterable))
36 # 迭代器
37 classmate_iterator = iter(classmate)
38 # 判断classmate_iterator是否是迭代器
39 print("判断classmate_iterator是否是迭代器:", isinstance(classmate_iterator,Iterator))
40 # print(next(classmate_iterator))
41
42 for name in classmate:
43 print(name)
44 time.sleep(1)