class cls: def __init__(self,data): self._data = data def __getitem__(self,index): return self._data[index] def __repr__(self): return str(self._data) >>> c1 = cls([11,22,33,44,55]) >>> I = iter(c1) >>> next(I) 11 为什么iter(c1)就会调用__getitem__,iter函数不是自动调用对象得__iter__方法吗
iter()
函数的作用是尝试获取一个对象的迭代器。根据 Python 的迭代协议,当 iter()
被调用时,它会首先尝试查找对象的 __iter__()
方法。如果该方法存在,则调用它并返回一个迭代器对象
__iter__()
方法,Python 会退而求其次,尝试查找 __getitem__()
方法
cls
类定义了 __getitem__()
方法,但没有定义 __iter__()
方法。因此,当调用 iter(c1)
时,Python 没有找到 __iter__()
方法,于是转而使用 __getitem__()
方法来实现迭代
__getitem__()
方法并传递递增的索引值(从 0 开始),来获取对象中的元素,直到触发 IndexError
异常,这标志着迭代结束
__iter__()
方法,只要定义了 __getitem__()
方法,对象也可以被迭代。这在某些情况下可以简化代码,但也需要注意,显式定义 __iter__()
方法通常会更清晰且更符合 Python 的迭代协议
__repr__
和 __str__
返回对象的字符串表示
如果类中没有定义 __str__
方法,Python 会自动回退到 __repr__
方法
__repr__
:在交互式控制台中直接输入对象名时会调用
__str__
:当使用 print
函数或 str()
函数时会调用