如何使用__getitem__和__iter__从字典中返回值?
我有一个对象,这个对象里面有一个字典,我想通过 __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
(键不重要)呢?
5 个回答
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]
在这种情况下,这个生成器产生的结果和第一个例子中的迭代器是完全一样的。
4
在库里添加这个方法:
def __iter__(self):
return self.books.itervalues()
这个方法会把遍历的工作交给字典,因为字典有一个很简单的方法来遍历它的值。你可以了解一下迭代器协议,它包括 __iter__
(适用于所有可迭代的对象)和 next
(在3.x中是__next__
,只适用于迭代器)这两个方法。
25
def __iter__(self): return self.books.itervalues()
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。