【发布时间】:2014-08-20 15:25:54
【问题描述】:
>>> class List(list):
... def __getitem__(self, i):
... print i, type(i)
... return super(List, self).__getitem__(i)
...
>>> x = List([0,1,2,3])
>>> x[1:3:]
slice(1, 3, None) <type 'slice'>
[1, 2]
>>> x[1:3]
[1, 2]
为什么第二种情况不使用List.__getitem__?它用什么代替?
>>> x[::]
slice(None, None, None) <type 'slice'>
[0, 1, 2, 3]
>>> x[:]
[0, 1, 2, 3]
同样,为什么这里的差异不是这两个切片操作?
【问题讨论】:
-
顺便说一句,这是 v2.7.6 所以
__getslice__(据称)已弃用 -
仅供参考,无法在 3.4.0 中重新创建(即,两种情况我都得到
slice(1, 3, None) <type 'slice'>)。 -
是的 py3 表现得很好
-
FWIW,因为它是一个子类,你可以通过定义
__getslice__ = lambda self, i, j: self.__getitem__(slice(i, j))使其保持一致。 -
和
__delslice__和__setslice__以及 的版本信息检查
标签: python list slice python-2.x magic-methods