Подтвердить что ты не робот

Итерация на 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
4b9b3361

Ответ 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)

    ...