Python提供“free”默认迭代器吗?

12 浏览
0 Comments

Python提供“free”默认迭代器吗?

可能是重复的:

为什么在Python中在一个类上定义getitem会使其可迭代?

我有一个基本上是Python列表的包装器类。在这个类中,我定义了getitemsetitemlen。我没有为这个类定义iter

当我执行以下操作时:

thing = ListWrapper(range(4))
for i in thing :
    print i

我得到的输出是:

0
1
2
3

这很好,但是我预期会收到某种错误消息,说Python找不到迭代器。我查看了文档,没有找到任何关于默认迭代器的参考。此外,在PyDev中跟踪代码显示,它在每次迭代时调用getitem方法。

我想知道在我的代码中依赖这种行为是否是一个好的做法。目前对我来说,这不太对劲。Python是否保证具有getitemlen的类将被视为具有定义的迭代器?对于这可能引起的其他奇怪行为的任何其他信息也是受欢迎的。

0
0 Comments

Python提供了默认的迭代器,但是有些类并没有实现__iter__方法,而是实现了__getitem__方法。在这种情况下,迭代器会通过连续的整数来调用__getitem__方法,直到没有元素可迭代为止。

这种行为的原因是为了方便使用者能够像操作列表一样操作这些类的实例。通过使用__getitem__方法,Python可以通过索引的方式来获取类的元素。

然而,这种默认的迭代行为也可能会导致问题。因为__getitem__方法可以接受任意索引,所以在使用迭代器遍历时可能会出现意外的结果。比如,如果一个类的__getitem__方法接受一个字符串作为索引,那么迭代器就会尝试使用连续的整数作为索引,这显然是错误的。

解决这个问题的方法是在类中实现__iter__方法,该方法返回一个迭代器对象。迭代器对象必须实现__iter____next__方法,__iter__方法返回迭代器对象自身,__next__方法返回迭代器中的下一个元素。

通过实现__iter__方法,Python就会使用该方法返回的迭代器来进行迭代操作,而不会再使用__getitem__方法。这样就可以避免__getitem__方法与迭代器产生冲突的问题。

总之,Python提供了默认的迭代器机制,但是对于没有实现__iter__方法的类,迭代器会使用__getitem__方法来进行迭代。然而,这种行为可能会导致意外的结果。为了避免这个问题,可以在类中实现__iter__方法,返回一个迭代器对象,从而避免__getitem__方法与迭代器产生冲突。

0