6

一些库,如 numpy、pandas 甚至 python 列表,为其对象实现了精美的索引。这意味着我可以执行以下操作:

obj[1:3, :]

如果我想在我的课堂上提供这个功能,我可以尝试重载__getitem____setitem__方法:

class Example(object):
   def __getitem__(self, x):
      pass

但我不明白这是如何工作的,因为1:3它不是一个有效的变量名。如何实现此功能?

4

2 回答 2

7

像这样的切片1:3会变成slice对象并传递给您的函数。如果您有多个索引器,它们将变成一个tuple. 展示:

>>> class Example(object):
...     def __getitem__(self, index):
...         return index
... 
>>> example = Example()
>>> example['hello']
'hello'
>>> example[1:5]
slice(1, 5, None)
>>> example[1:5, 10:15]
(slice(1, 5, None), slice(10, 15, None))
于 2013-09-09T00:04:04.417 回答
5

切片符号的唯一特别之处是 的简写slice,它使您的代码等效于:

obj[(slice(1, 3), slice(None, None))]

传递给的参数__getitem__是项目的“索引”,可以是任何对象:

def __getitem__(self, index):
    if isinstance(index, tuple):
        # foo[1:2, 3:4]
    elif isinstance(index, slice)
        # foo[1:2]
    else:
        # foo[1]
于 2013-09-09T00:08:35.143 回答