为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在类上定义__getitem__使其在python中可迭代?

为什么在类上定义__getitem__使其在python中可迭代?

RISEBY 2019-12-27 11:01:54
为什么在类上定义__getitem__使其可迭代?例如,如果我写:class b:  def __getitem__(self, k):    return kcb = b()for k in cb:  print k我得到的输出:012345678...我真的希望看到从“ for c in kb”返回的错误:
查看完整描述

3 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

如果查看定义迭代器的PEP234,它会显示:


1. An object can be iterated over with "for" if it implements

   __iter__() or __getitem__().


2. An object can function as an iterator if it implements next().


查看完整回答
反对 回复 2019-12-27
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

对迭代的支持__getitem__可以看作是“旧版功能”,当PEP234将可迭代性作为主要概念引入时,它可以更平滑地过渡。它仅适用于类,而__iter____getitem__接受整数0,1,&C,并提出IndexError一旦指数过高(如果有的话),典型的“序列”类编码之前__iter__出现(虽然没有从编码新类也以此方式阻止你)。

就我个人而言,我不希望新代码中不依赖于此,尽管它既不被弃用也不消失(在Python 3中也可以正常工作),所以这只是样式和口味的问题(“显式优于隐式”)我宁愿显式地支持可迭代性,而不是依靠对__getitem__我隐式地支持它-但不是很大)。


查看完整回答
反对 回复 2019-12-27
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

__getitem__早于迭代器协议,并且在过去是使事物可迭代的唯一方法。因此,仍然支持它作为迭代方法。本质上,迭代协议是:

  1. 检查__iter__方法。如果存在,请使用新的迭代协议。

  2. 否则,请尝试__getitem__使用连续较大的整数值进行调用,直到引发IndexError。

(2)曾经是实现此目的的唯一方法,但缺点是它假设需要更多的资源来支持迭代。为了支持迭代,您必须支持随机访问,这对于文件或网络流之类的东西来说要昂贵得多,因为向前访问很容易,但是向后走则需要存储所有内容。 __iter__允许没有随机访问的迭代,但是由于随机访问通常无论如何都允许迭代,并且由于破坏向后兼容性会很糟糕,__getitem__因此仍受支持。


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 616 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信