我有这段代码可以创建一个笔记并添加到笔记本中。当我运行这个时,我得到了一个非序列错误的迭代。
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
答案 0 :(得分:11)
您正在尝试迭代对象本身,这将返回错误。您希望迭代对象内的列表,在这种情况下Notes.notes
(这有点令人困惑的命名,您可能希望通过使用笔记本对象实例的另一个名称来区分内部列表)。
for note in Notes.notes:
print(note.memo)
答案 1 :(得分:9)
Notes是NoteBook
的一个实例。要迭代这样的对象,它需要__iter__
method:
class NoteBook:
def __iter__(self):
return iter(self.notes)
PS。 Python中的PEP8推荐/约定是为类的实例使用小写变量名,为类名使用CamelCase。 遵循此约定将帮助您立即从类中识别您的类实例。
如果您希望遵循此惯例(并且喜欢喜欢此惯例的其他人),请将Notes
更改为notes
。
答案 2 :(得分:2)
如果您想实际迭代Notes本身,您还可以添加自定义__iter__ method to it that returns the .notes property.
class Notebook:
def __iter__(self):
return iter(self.notes)
...
答案 3 :(得分:1)
问题在于行for note in Notes:
,因为Notes是对象而不是列表。我相信你想要for note in Notes.notes:
同样unutbu指出,你可以重载__iter__
运算符,这将允许你的当前循环工作。这取决于你希望它如何向外出现。我个人会重载__iter__