关于迭代器方面的疑惑
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__() 方法)的集合对象,或必须支持序列协议(有 __getitem__() 方法,且数字参数从 0 开始)。
如果它不支持这些协议,会触发 TypeError。
如果有第二个实参 sentinel,那么 object 必须是可调用的对象。这种情况下……
即 有__getitem__() 或 __iter__() 这两个方法中的其中一个,都可以 转为 iterator对象。
你可以把 __getitem__() 部分注释掉,就会报错:TypeError: 'Person' object is not iterable
{:10_333:} 阿奇_o 发表于 2021-4-8 00:55
还是官方文档,让我长知识:
谢谢,遇事不决先看官方文档。
页:
[1]