一些库,如 numpy、pandas 甚至 python 列表,为其对象实现了精美的索引。这意味着我可以执行以下操作:
obj[1:3, :]
如果我想在我的课堂上提供这个功能,我可以尝试重载__getitem__
和__setitem__
方法:
class Example(object):
def __getitem__(self, x):
pass
但我不明白这是如何工作的,因为1:3
它不是一个有效的变量名。如何实现此功能?
一些库,如 numpy、pandas 甚至 python 列表,为其对象实现了精美的索引。这意味着我可以执行以下操作:
obj[1:3, :]
如果我想在我的课堂上提供这个功能,我可以尝试重载__getitem__
和__setitem__
方法:
class Example(object):
def __getitem__(self, x):
pass
但我不明白这是如何工作的,因为1:3
它不是一个有效的变量名。如何实现此功能?
像这样的切片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))
切片符号的唯一特别之处是 的简写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]