Итерация на Python по нескольким
У меня есть этот кусок кода, который создает заметку и добавляет к ноутбуку. Когда я запускаю это, я получаю итерацию по ошибке без последовательности.
import datetime
class Note:
def __init__(self, memo, tags):
self.memo = memo
self.tags = tags
self.creation_date = datetime.date.today()
def __str__(self):
return 'Memo={0}, Tag={1}'.format(self.memo, self.tags)
class NoteBook:
def __init__(self):
self.notes = []
def add_note(self,memo,tags):
self.notes.append(Note(memo,tags))
if __name__ == "__main__":
firstnote = Note('This is my first memo','example')
print(firstnote)
Notes = NoteBook()
Notes.add_note('Added thru notes','example-1')
Notes.add_note('Added thru notes','example-2')
for note in Notes:
print(note.memo)
Ошибка:
C:\Python27\Basics\OOP\formytesting>python notebook.py
Memo=This is my first memo, Tag=example
Traceback (most recent call last):
File "notebook.py", line 27, in
for note in Notes:
TypeError: iteration over non-sequence
Ответы
Ответ 1
Вы пытаетесь выполнить итерацию по самому объекту, который возвращает ошибку. Вы хотите перебирать список внутри объекта, в этом случае Notes.notes
(что несколько запутывает именование, вы можете выделить внутренний список, используя другое имя для экземпляра объекта notebook).
for note in Notes.notes:
print(note.memo)
Ответ 2
Заметки - это пример NoteBook
. Чтобы перебрать такой объект, ему нужен метод __iter__
:
class NoteBook:
def __iter__(self):
return iter(self.notes)
PS. Это рекомендация/соглашение
Ответ 3
Проблема заключается в строке for note in Notes:
, поскольку Notes является объектом не списком. Я считаю, что вы хотите for note in Notes.notes:
также как указано unutbu, вы можете перегрузить оператор __iter__
, который позволит вашему текущему циклу работать. Это зависит от того, как вы хотите, чтобы это выглядело внешне. Лично я бы перегрузил __iter__
Ответ 4
Если вы хотите на самом деле итерации Notes самостоятельно, вы также можете добавить пользовательский __iter__ method to it that returns the .notes property.
class Notebook:
def __iter__(self):
return iter(self.notes)
...