16

メモを作成してノートブックに追加するこのコードがあります。これを実行すると、Iteration over non-sequence エラーが発生します。

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  
メモ=初めてのメモ、タグ=例  
トレースバック (最新の呼び出しが最後):  
  ファイル「notebook.py」の 27 行目   
    メモのメモ:  
TypeError: 非シーケンスの繰り返し
4

4 に答える 4

13

エラーを返しているオブジェクト自体を反復処理しようとしています。この場合、オブジェクト内のリストを反復処理する必要がありますNotes.notes(これは、名前付けがやや紛らわしいため、ノートブックオブジェクトのインスタンスに別の名前を使用して内部リストを区別することをお勧めします)。

for note in Notes.notes:
    print(note.memo)
于 2012-08-08T19:21:54.697 に答える
9

NotesはのインスタンスですNoteBook__iter__このようなオブジェクトを反復処理するには、次のメソッドが必要です。

class NoteBook:

    def __iter__(self):
        return iter(self.notes)

PS。クラスのインスタンスに小文字の変数名を使用し、クラス名にCamelCaseを使用することは、PythonでのPEP8の推奨事項/規則です。この規則に従うと、クラスからクラスインスタンスを即座に認識するのに役立ちます。

この規則に従う(そしてこの規則が好きな他の人を愛する)場合は、に変更Notesしてnotesください。

于 2012-08-08T19:21:28.807 に答える
2

実際に Notes 自体を反復したい場合は、カスタムを追加することもできます__iter__ method to it that returns the .notes property.

class Notebook:

    def __iter__(self):
        return iter(self.notes)

    ...
于 2012-08-08T19:23:47.197 に答える
1

for note in Notes: Notesはリストではなくオブジェクトであるため、問題は行にあります。私はあなたが欲しいと信じていますfor note in Notes.notes:

また、unutbuが指摘したように、__iter__演算子をオーバーロードして、現在のループを機能させることができます。これをどのように外向きに表示するかによって異なります。個人的に私は過負荷になります__iter__

于 2012-08-08T19:21:06.157 に答える