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

2025-02-25 09:07:00
admin
原创
18
摘要:问题描述:为什么__getitem__在类上定义会使其可迭代?例如如果我写:class B: def __getitem__(self, k): return k cb = B() for k in cb: print k 我得到输出:0 1 2 3...

问题描述:

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

例如如果我写:

class B:
    def __getitem__(self, k):
        return k
    
cb = B()
        
for k in cb:
    print k

我得到输出:

0
1
2
3
4
5
...

我确实希望看到从 返回一个错误for k in cb:


解决方案 1:

迭代的支持__getitem__可以看作是一项“遗留功能”,当PEP234将可迭代性作为主要概念引入时,它允许更平稳的过渡。它仅适用于没有接受整数 0、1 等的类,__iter__并且__getitem__一旦IndexError索引变得太高(如果有的话)就会增加,通常是之前编码的“序列”类__iter__(尽管没有什么可以阻止您以这种方式编码新类)。

就我个人而言,我宁愿不在新代码中依赖它,尽管它没有被弃用也不会消失(在 Python 3 中也能正常工作),所以这只是一个风格和品味的问题(“显式优于隐式”所以我宁愿明确支持可迭代性,而不是依赖于__getitem__隐式支持它——但这不是什么大问题)。

解决方案 2:

如果你看一下PEP234定义迭代器,它说:

  1. for如果对象实现了__iter__()或 ,就可以用 进行迭代__getitem__()

  2. 如果对象实现了,它就可以充当迭代器的功能next()

解决方案 3:

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

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

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

(2) 曾经是实现此目的的唯一方法,但其缺点是它假设了比仅支持迭代所需的更多内容。要支持迭代,您必须支持随机访问,这对于文件或网络流等内容来说要昂贵得多,因为向前访问很容易,但向后访问则需要存储所有内容。 __iter__允许迭代而不进行随机访问,但由于随机访问通常允许迭代,并且破坏向后兼容性会很糟糕,__getitem__因此仍然受支持。

解决方案 4:

特殊方法,例如__getitem__向对象添加特殊行为,包括迭代。

http://docs.python.org/reference/datamodel.html#object获取项目

“for 循环期望对非法索引引发 IndexError,以便正确检测序列的末尾。”

引发 IndexError 来表示序列的结束。

您的代码基本上相当于:

i = 0
while True:
    try:
        yield object[i]
        i += 1
    except IndexError:
        break

其中 object 是您在 for 循环中进行迭代的对象。

解决方案 5:

这是出于历史原因。在 Python 2.2 之前,__getitem__ 是创建可以使用 for 循环进行迭代的类的唯一方法。在 2.2 中,添加了 iter 协议,但为了保持向后兼容性,__getitem__ 仍可在 for 循环中使用。

解决方案 6:

因为cb[0]与 相同cb.__getitem__(0)。请参阅Python 文档。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用