HttpResponse
- это класс, который может хранить строковые данные. Данные хранятся в переменной-члене с именем _container
.
Предположим, hr
- это экземпляр HttpResponse
с данными внутри него. Когда вы звоните iter(hr)
, вы должны получить итератор. Этот итератор будет возвращать данные из переменной _container
.
Этот класс «оборачивает» элемент _container
, чтобы он всегда мог возвращать текст не в Юникоде. Поскольку в этом классе есть функция метода __iter__()
, при вызове iter()
вы действительно вызываете специальную функцию __iter__()
метода. Эта функция метода фактически вызывает iter()
для переменной-члена _container
, чтобы получить итератор для ее содержимого. Но затем он сохраняет этот итератор в переменной-члене _iterator
и возвращает self
. Теперь он готов к повторению.
Определена функция метода next()
. Если тип переменной _container
- Unicode, он вызывает encode()
для кодирования Unicode в некоторой кодировке и возврата не-Unicode. Он использует другую переменную-член _charset
, чтобы узнать, какую кодировку использовать для кодирования. Если тип переменной container
не является Unicode, это должен быть обычный строковый тип, и данные просто возвращаются без изменений.
Таким образом, объект, «обернутый» в этом классе, может быть повторен и всегда возвращать текст не в Юникоде.
Я удивлен этой реализацией протокола итератора. Когда он возвращает вам итератор, он просто возвращает self
, поэтому, если вы вызовете iter()
дважды, вы на самом деле не получите два используемых итератора. Кажется, это может быть опасно. Я думаю, что код Django никогда не делает ничего подобного.