为什么将类设置为可迭代会产生这样的输出?

7 浏览
0 Comments

为什么将类设置为可迭代会产生这样的输出?

为什么在Python中定义类的getitem方法会使其可迭代?

我得到了以下输出:

0

1

2

3

4

5

6

7

8

.....

迭代类b的实例会产生整数。为什么会这样?(在查看为什么在Python中定义getitem方法会使其可迭代时,偶然遇到了上述程序)

0
0 Comments

为什么将一个类设置为可迭代会产生这样的输出?

原因是因为当对象定义了__getitem__但没有定义__iter__时,for循环会通过将连续的索引传递给对象的__getitem__方法来实现。详见the effbot。(根据我的理解,背后的实现原理稍微复杂一些:如果对象没有提供__iter__,则会在对象上调用iteriter返回的迭代器会调用底层对象的__getitem__。)

解决方法是在类中实现__iter__方法,该方法返回一个迭代器对象,迭代器对象必须实现__next__方法,该方法返回迭代的下一个元素。通过定义迭代器对象,我们可以控制迭代过程中返回的元素。

以下是一个示例代码,演示了如何将一个类设置为可迭代并产生相应的输出:

class MyIterable:
    def __init__(self, data):
        self.data = data
    def __iter__(self):
        self.index = 0
        return self
    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value
my_iterable = MyIterable([1, 2, 3, 4, 5])
for item in my_iterable:
    print(item)

在上述代码中,我们定义了一个名为MyIterable的类,该类具有__iter____next__方法。在__iter__方法中,我们初始化了一个索引变量,并返回了自身作为迭代器对象。在__next__方法中,我们检查索引是否超出了数据的长度,如果是则抛出StopIteration异常,否则返回索引对应的元素,并将索引加1。通过使用这个类,我们可以通过for循环迭代输出类中的元素。

希望这篇文章对理解为什么将一个类设置为可迭代会产生这样的输出以及如何解决这个问题有所帮助。

0