Каково использование возврата self в методе __iter__?

def __iter__(self): return self 

Просто хотел знать, что делает этот код в целом, зачем он нужен.

Я прошел много учебников и блоков кода, получал множественные ответы без какой-либо надлежащей спецификации, просто краткое объяснение было бы замечательным.

2 Solutions collect form web for “Каково использование возврата self в методе __iter__?”

EDIT: для 2.7 вместо 3

Вот мое понимание

В приведенном ниже примере кода мы можем сказать, что Class Testing является итерируемым объектом, потому что мы реализовали его с помощью __iter__ . Метод __iter__ возвращает итератор. Итератор использует следующий метод для определения следующего значения на итерации. Если бы я удалил next метод из нижеприведенного класса, код завершился бы неудачно.

iterable = объект, который может быть повторен … реализован с помощью __iter__

iterator = объект, который определяет, как итерации … буквально, что такое следующее значение. Это выполняется с помощью __next__

Таким образом, фрагмент кода, который вы задавали, фактически принимает объект класса (self – это аргумент) и возвращает итератор, что делает объект класса итерабельным. Итак, в приведенном ниже примере мы можем фактически перебирать объект класса myObj.

 class Testing: def __init__(self,a,b): self.a = a self.b = b def __iter__ (self): return self def next(self): if self.a <= self.b: self.a += 1 return self.a-1 else: raise StopIteration myObj = Testing(1,5) for i in myObj: print i 

Это немного запутанно. Короче говоря, определение __iter__ для возврата self по существу превращает объект итератора в итерируемый быстро, чтобы вы могли использовать его в цикле for.

Напомним, что итератором является объект со следующим методом с целью возвращения следующего элемента в процессе выполнения итерации. После вызова следующего метода изменяется состояние итератора.

Напомним, что итерабельным является объект с методом __iter__, целью которого является возвращение нового итератора для выполнения итерации.

Чтобы отделить понятия, давайте возьмем пример итератора OneToFourIterator и итерабельного OneToFourIterable

 class OneToFourIterator: def __init__(self): self.state = 0 def next(self): self.state += 1 if self.state > 4: raise StopIteration return self.state class OneToFourIterable: def __init__(self): pass def __iter__(self): return OneToFourIterator() 

Чтобы выполнить итерацию с помощью цикла for, вы должны дать ей итерируемый, как это,

 for i in OneToFourIterable(): print i 

Если вы используете итератор в цикле for, он даст ошибку. Чтобы использовать итератор для итерации, вы сделали бы что-то вроде этого

 iterator = OneToFourIterator() while True: try: current = iterator.next() print current except StopIteration: break 

Наконец, я думаю, что ответ на вопрос, почему люди определяют __iter__, чтобы вернуть себя, заключается в том, что вместо того, чтобы писать 2 класса, как указано выше, вы можете быстро превратить итератор в итерируемый, чтобы вы могли использовать его в цикле for:

 class OneToFourIteratorAndIterable: def __init__(self): self.state = 0 def next(self): self.state += 1 if self.state > 4: raise StopIteration return self.state pass def __iter__(self): return self for i in OneToFourIteratorAndIterable(): print i 
  • Как поймать это исключение Python: ошибка: Существующее соединение было принудительно закрыто удаленным хостом
  • Использование Twython для отправки твита, twitter api error
  • Python google api
  • Различать совпадения в pyparsing
  • Как преобразовать tuple в многопользовательский словарь в python?
  • Как удалить последний utf8-символ строки python
  • python игнорировать сертификат подтверждения urllib2
  • Как создать триггер с threading.Timer?
  • Python - лучший язык программирования в мире.