Почему возможно перебирать строку?

Я пытаюсь понять, почему я могу выполнять итерацию вдоль строки. Что я вижу в документации:

Один метод должен быть определен для объектов-контейнеров, чтобы предоставлять поддержка итераций:

контейнер. __ iter__()

Возвращает объект итератора. Требуется объект для поддержки протокола итератора, описанного ниже. Если контейнер поддерживает разные типы итераций, могут быть добавлены дополнительные методы. предоставляется специально для запроса итераторов для этих типов итераций. (Примером объекта, поддерживающего несколько форм итерации, может быть быть древовидной структурой, которая поддерживает как в ширину, так и в глубину обход.) Этот метод соответствует слоту tp_iter типа структура для объектов Python в Python/C API.

Сами объекты итераторов должны поддерживать следующие два метода, которые вместе образуют протокол итератора:

iterator. __ iter__()

Вернуть сам объект итератора. Это требуется, чтобы разрешить использование как контейнеров, так и итераторов с для и в заявлениях. Этот метод соответствует слоту tp_iter структура типов для объектов Python в Python/C API.

итератор. next()

Возвращает следующий элемент из контейнера. Если есть больше нет элементов, вызовите исключение StopIteration.Этот метод соответствует слоту tp_iternext структуры типов для Python объекты в 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(). Так почему же это работает?

14
задан Michael Petrotta 10 March 2012 в 18:43
поделиться