|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
class Person:
def __init__(self):
self.age = 1
def __getitem__(self, item):
self.age += 1
if self.age >= 6:
raise StopIteration
return self.age
import collections
p = Person()
print(isinstance(p,collections.Iterable)) #False
print(isinstance(p,collections.Iterator)) #False
pt = iter(p)
print(isinstance(pt,collections.Iterable)) #True
print(isinstance(pt,collections.Iterator)) #True
若上定义了一个用for遍历的Person类。p实例不是一个可迭代对象,而pt是个迭代器。
问题:一个自定义对象有__getitem__方法,没有__iter__和__next__方法,为什么iter(这个自定义对象)就可以生成迭代器呢?
不是说用iter函数,iter(可迭代对象,如:列表、元组,字符串,range函数返回值、zip函数返回值、enumerate函数返回值等具有__iter__方法的对象)才可以生成迭代器吗?或者说究竟iter函数的对象都是什么才可以生成迭代器呢?
还是官方文档,让我长知识:
- iter(object[, sentinel])
- 返回一个 iterator 对象。
- 根据是否存在第二个实参,第一个实参的解释是非常不同的。
- 如果没有第二个实参,object 必须是支持迭代协议(有 __iter__() 方法)的集合对象,[b]或[/b]必须支持序列协议(有 __getitem__() 方法,且数字参数从 0 开始)。
- 如果它不支持这些协议,会触发 TypeError。
- 如果有第二个实参 sentinel,那么 object 必须是可调用的对象。这种情况下……
复制代码
即 有__getitem__() 或 __iter__() 这两个方法中的其中一个,都可以 转为 iterator对象。
你可以把 __getitem__() 部分注释掉,就会报错:TypeError: 'Person' object is not iterable
|
|