Форум сайта python.su
> тут вторая ветка со своим старым стилем классов
Нет. Это новый стиль классов.
> Это какой-то новый паттерн делегирования?)
Я не знаю что такое “паттерн делегирования”. А __iter__ тебе вернуть всё что угодно может.
Офлайн
Rodegast
RodegastДа, день был тяжёлый, не заметил наследование object.
Это новый стиль классов.
Rodegasthttps://ru.wikipedia.org/wiki/Шаблон_делегирования
Я не знаю что такое “паттерн делегирования”.
RodegastВ данном случае __iter__ мне вернул итератор списка, этот класс просто “класс-обёртка”, но обёртывает он глобальный объект, а не свой атрибут, поэтому я подумал о делегирование.
__iter__ тебе вернуть всё что угодно может.
Офлайн
Rodegast
Нет. Это новый стиль классов.
ron_1Это новый стиль классов во втором питоне, который уже сам по себе устаревший.
Да, день был тяжёлый, не заметил наследование object.
ron_1В питоне эти понятия разделены. Итерируемый объект может не быть итератором. А итератор - это определённый протокол (набор правил).
Так же нету чёткой грани между итератором и итерируемым объектом (слова лутца).
>>> r = range(3) >>> r range(0, 3) >>> next(r) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'range' object is not an iterator >>> list(r) [0, 1, 2] >>> set(r) {0, 1, 2} >>>
>>> class A: ... def __iter__(self): ... print('hello') ... >>> list(A()) hello Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: iter() returned non-iterator of type 'NoneType' >>> >>> set(A()) hello Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: iter() returned non-iterator of type 'NoneType' >>> >>> for i in A(): pass ... hello Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: iter() returned non-iterator of type 'NoneType' >>>
ron_1В твоём коде нарушен протокол итератора. В конце он должен порождать исключение StopIteration.class my: def __init__(self): self.a = [1, 2, 3] def __iter__(self): self.n = 0 return self def __next__(self): self.n += 1 return self.a[self.n]
>>> class my: ... def __init__(self): ... self.a = [1, 2, 3] ... def __iter__(self): ... self.n = 0 ... return self ... def __next__(self): ... self.n += 1 ... return self.a[self.n] ... >>> for i in my(): ... i ... 2 3 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 9, in __next__ IndexError: list index out of range >>>
Отредактировано py.user.next (Ноя. 21, 2017 01:32:39)
Офлайн
> pattern = шаблон
Да в курсе я. Просто психам хаскелистам оно без надобности.
Офлайн