Python-类对象特殊方法——__iter__()、__next__()

  1. 类对象特殊方法——iter()、next()

类对象特殊方法——iter()、next()

之所以for-in语句可以用于某些内置类对象(例如:list、tuple、str等)的实例对象,是因为这些内置类对象中都实现了特殊方法__iter__()和__next__()。

>>> L = [1, 2, 3, 4, 5]
>>> for item in L:
...     print(item)
...
1
2
3
4
5

for-in语句在默认情况下不能用于自定义类对象的实例对象。

>>> class MyClass(object):
...     pass
...
>>> for item in MyClass():
...     print(item)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'MyClass' object is not iterable

如果想让for-in语句可以用于自定义类对象的实例对象,必须在自定义类对象中实现特殊方法__iter__()和__next__()。
for-in语句首先会调用 特殊方法__iter__()返回一个可迭代对象,然后不断调用可迭代对象的特殊方法__next__()返回下一次迭代的值,直到遇到StopIteration时退出循环。
只实现了特殊方法__iter__()的类对象,被称为可迭代对象;同时实现了特殊方法__iter__()和__next__()的类对象,被称为迭代器类对象

#!/usr/bin/python3

class MyClass(object):
    def __init__(self, data):
        self.data = 0

    def __iter__(self):                   # 先自动调用__iter__()返回一个可迭代对象。如果没有这个方法,则依然会报TypeError: 'MyClass' object is not iterable错误
        return self

    def __next__(self):                   # 再自动调用__next__()依次返回可迭代对象的值,注意设置退出迭代条件,否则容易死循环
        if self.data >= 5:
            raise StopIteration

        else:
            self.data += 1
            return self.data

mc = MyClass(5)

for i in mc:
    print(i)
[root@lyucan ~]# ./iter.py
1
2
3
4
5

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com