列表切片如何挂钩到__getitem__?

时间:2014-08-20 15:25:54

标签: python list slice python-2.x magic-methods

>>> 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]

同样,为什么这里的差异不是这两个切片操作?

2 个答案:

答案 0 :(得分:2)

language reference说明了一切。具体做法是:

  
    
      

自2.0版以来不推荐使用:支持切片对象作为参数__getitem__()方法。 (但是,CPython中的内置类型目前仍然实现__getslice__()因此,在实现切片时必须在派生类中覆盖它。

    
  

  
    
      

被要求实施 self [i:j] ...

的评估     
  

请注意,它无法处理self[i:j:] ...

答案 1 :(得分:0)

以下是python2.7 documentation中描述切片如何工作的部分:

  

切片现在选择具有索引k的所有项目,使得i <= k <1。 j其中i和j是指定的下限和上限。