Python:如何在__getitem__中实现slice?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (268)

我正在试图为我创建的类创建矢量表示的切片功能。

到目前为止,我有这样的代码,我相信它会正确地实现切片,但是每当我做一个像v[4]v是一个向量python 的调用时,都会返回一个关于没有足够参数的错误。所以我想弄清楚如何getitem在我的类中定义特殊的方法来处理普通索引和切片。

def __getitem__(self, start, stop, step):
    index = start
    if stop == None:
        end = start + 1
    else:
        end = stop
    if step == None:
        stride = 1
    else:
        stride = step
    return self.__data[index:end:stride]
提问于
用户回答回答于

__getitem__()方法将slice在对象切片时接收一个对象。简单地看startstopstep对成员的slice对象,以获得组件切片。

>>> class C(object):
...   def __getitem__(self, val):
...     print val
... 
>>> c = C()
>>> c[3]
3
>>> c[3:4]
slice(3, 4, None)
>>> c[3:4:-2]
slice(3, 4, -2)
>>> c[():1j:'a']
slice((), 1j, 'a')
用户回答回答于

我有一个“合成”列表(其中一个数据比你想在内存中创建的数据大),我__getitem__看起来像这样:

def __getitem__( self, key ) :
    if isinstance( key, slice ) :
        #Get the start, stop, and step from the slice
        return [self[ii] for ii in xrange(*key.indices(len(self)))]
    elif isinstance( key, int ) :
        if key < 0 : #Handle negative indices
            key += len( self )
        if key < 0 or key >= len( self ) :
            raise IndexError, "The index (%d) is out of range."%key
        return self.getData(key) #Get the data from elsewhere
    else:
        raise TypeError, "Invalid argument type."

切片不会返回相同的类型,这是一个禁忌,但它对我有用。

扫码关注云+社区

领取腾讯云代金券