Python list() 方法原理,以及自己动手实现迭代类,重点在于 __iter__和__next__方法
代码1:自己实现迭代类
import time
from collections import Iterable
class ClassMate(object):
def __init__(self):
self.names = list()
def add(self, name):
self.names.append(name)
# 添加__iter__方法,实现对象支持迭代功能
def __iter__(self):
return ClassIterator(self)
class ClassIterator(object):
def __init__(self, obj):
self.obj = obj
self.__c = 0
def __iter__(self):
pass
def __next__(self):
if self.__c<len(self.obj.names):
data = self.obj.names[self.__c]
self.__c+=1
return data
else:
# exit(0)
raise StopIteration # 抛出该异常后for循环迭代自动停止
classmate = ClassMate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
print("判断classmate对象是否可以迭代:", isinstance(classmate, Iterable))
for name in classmate:
print(name)
time.sleep(0.2)
for name in classmate:
print(name)
time.sleep(0.2)
代码2:自己实现改进的迭代类并测试list()方法使用:
import time
from collections import Iterable,Iterator
class ClassMate(object):
def __init__(self):
self.names = list()
# self.__c = 0 将这句话移动到__iter__方法内,实现每次for循环迭代都初始化self.__c,否则fou循环只能使用一次
def add(self, name):
self.names.append(name)
# 添加__iter__方法,实现对象支持迭代功能
def __iter__(self):
self.__c = 0
# return ClassIterator(self)
return self
def __next__(self):
if self.__c < len(self.names):
data = self.names[self.__c]
self.__c+=1
return data
else:
# exit(0)
raise StopIteration # 抛出该异常后for循环迭代自动停止
# class ClassIterator(object):
#
# def __init__(self, obj):
# self.obj = obj
# self.__c = 0
# def __iter__(self):
# pass
#
# def __next__(self):
# if self.__c<len(self.obj.names):
# data = self.obj.names[self.__c]
# self.__c+=1
# return data
# else:
# # exit(0)
# raise StopIteration # 抛出该异常后for循环迭代自动停止
classmate = ClassMate()
classmate.add("老王")
classmate.add("王二")
classmate.add("张三")
print("判断classmate对象是否可以迭代:", isinstance(classmate, Iterable))
classmate_iterator = iter(classmate)
print("判断classmate对象是否为迭代容器:", isinstance(classmate_iterator, Iterator))
for name in classmate:
print(name)
time.sleep(0.5)
for name in classmate:
print(name)
time.sleep(0.5)
"""
list()方法实际上是通过调用参数对象里的迭代器,通过一步一步的next(classmate),
完成从对象到列表的转换的。如下代码所示:classmate是自定义迭代类生成的一个对象,
可使用list()方法实现列表转换就是因为其是可迭代的。
"""
a = list(classmate)
print(a)