我有一个带有字典的对象,我想通过__getitem__
访问并迭代(仅限值,键无关紧要),但我不知道该怎么做。
例如:
Python 2.5.2 (r252:60911, Jul 22 2009, 15:33:10)
>>> class Library(object):
... def __init__(self):
... self.books = { 'title' : object, 'title2' : object, 'title3' : object, }
... def __getitem__(self, i):
... return self.books[i]
...
>>> library = Library()
>>> library['title']
<type 'object'>
>>> for book in library:
... print book
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getitem__
KeyError: 0
>>>
如何告诉它只需返回字典中每个项目的object
(关键无关紧要)?
答案 0 :(得分:24)
def __iter__(self): return self.books.itervalues()
答案 1 :(得分:4)
将此方法添加到库:
def __iter__(self):
return self.books.itervalues()
这会将迭代委托给dict,它有一个简单的方法来迭代值。阅读迭代器协议,它包含__iter__
(在所有迭代中)和next
(3.x中的__next__
)(仅在迭代器上)方法。
答案 2 :(得分:3)
您可以从内部数据返回迭代器:
class Library (object):
...
def __iter__(self):
return self.books.itervalues()
itervalues()
返回字典值的迭代器。
如果您想要更多控制,可以使__iter__
成为生成器函数
class Library (object):
...
def __iter__(self):
for title in self.books:
yield self.books[title]
在这种情况下,这个生成器产生的结果与第一个例子中的迭代器完全相同。
答案 3 :(得分:2)
>>> class Library(object):
... def __init__(self):
... self.books = { 'title' : object, 'title2' : object, 'title3' : object, }
... def __getitem__(self, i):
... return self.books[i]
... def __iter__(self):
... return self.books.itervalues()
...
>>> library = Library()
>>> library['title']
<type 'object'>
>>> for book in library:
... print book
...
<type 'object'>
<type 'object'>
<type 'object'>
答案 4 :(得分:0)
您是否考虑过使用UserDict mixin?
答案 5 :(得分:0)
__getitem__(self,key)
,其中key是一个整数,因为你的self.books是一个字典而你不能self.books[integer]
e.g:
>>>d = {'a':'sdsdsd','b':'sfsdsd'}
>>d[0]
d[0]
Traceback (most recent call last):
File "<console>", line 1, in <module>
KeyError: 0
迭代协议如下:
迭代器协议包含两种方法。 __iter__()
方法必须返回迭代器对象和next()
方法,该方法返回序列中的下一个元素。
以前,如果未定义__iter__
方法,则会通过以递增的值连续调用__getitem__
,直到它使索引超出范围错误,从而回退到__getitem__
。