【发布时间】:2012-03-27 19:00:33
【问题描述】:
我试图理解为什么我可以遍历字符串。我在文档中看到的是:
需要为容器对象定义一个方法来提供 迭代支持:
容器。__iter__()
返回一个迭代器对象。对象是必需的 支持下面描述的迭代器协议。如果一个容器 支持不同类型的迭代,可以附加方法 提供专门为这些迭代类型请求迭代器。 (一个支持多种迭代形式的对象的例子是 是一个支持广度优先和深度优先的树结构 traversal.) 这个方法对应于类型的 tp_iter slot Python/C API 中 Python 对象的结构。
迭代器对象本身需要支持以下 两种方法,共同构成迭代器协议:
迭代器。__iter__()
返回迭代器对象本身。这是 需要允许容器和迭代器与 for 和 in 语句。这个方法对应的tp_iter slot Python/C API 中 Python 对象的类型结构。
迭代器。下一个()
从容器中返回下一个项目。如果有 没有其他项目,引发 StopIteration 异常。这种方法 对应于 Python 的类型结构的 tp_iternext 槽 Python/C API 中的对象。
但是……
>>> dir('aa')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
'__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower',
'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip',
'swapcase', 'title', 'translate', 'upper', 'zfill']
我在这里没有看到任何 __iter__() 或 next()。那么它为什么会起作用呢?
【问题讨论】:
-
虽然我怀疑它在这里是否相关,但在这种情况下不要太相信
dir。正如文档所说:“因为提供 dir() 主要是为了方便在交互式提示下使用,所以它尝试提供一组有趣的名称,而不是尝试提供一组严格或一致定义的名称,并且它的详细行为可能会因版本而异。例如,当参数是类时,元类属性不在结果列表中。" -
只是为了说明问题。
str实例在 python 3.2 中实现了__iter__
标签: python