如何使用__getitem__和__iter__从字典中返回值?

15 投票
5 回答
30530 浏览
提问于 2025-04-15 16:16

我有一个对象,这个对象里面有一个字典,我想通过 __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()

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

撰写回答