您需要提供自定义的
__getitem__(),
__setitem__和
__delitem__挂钩。
切片列表时,将这些切片对象传递给切片对象。这些有
start,
stop和
step属性。但是,这些值可以是
None,以指示默认值。请注意,当您使用负步幅时,默认值实际上会改变!
但是,它们也有一种
slice.indices()方法,当给定长度时会生成
(start,stop, step)适合
range()对象的值的元组。此方法会处理令人讨厌的细节,例如以负的步幅进行切片,并且没有开始或停止索引:
def __getitem__(self, key): if isinstance(key, slice): indices = range(*key.indices(len(self.list))) return [self.list[i] for i in indices] return self.list[key]
或者,对于您的情况:
def __getitem__(self, key): return self.list[key]
因为a
list可以
slice直接拿物体。
在Python
2中,
list.__getslice__如果实现了切片,则可以不加跨步地调用切片(因此,仅起始索引和终止索引),并且内置
list类型实现了切片,因此您也必须覆盖它。一个简单的委托给您的
__getitem__方法应该可以:
def __getslice__(self, i, j): return self.__getitem__(slice(i, j))



