我创建了如下课程:
class MyList(list):
def __init__(self, lst):
self.list = lst
我希望在MyList
中覆盖切片功能答案 0 :(得分:33)
您需要提供自定义__getitem__()
,__setitem__
和__delitem__
个钩子。
切片列表时传递slice object;它们具有start
,stop
和step
属性(可能是None
):
def __getitem__(self, key):
if isinstance(key, slice):
return [self.list[i] for i in xrange(key.start, key.stop, key.step)]
return self.list[key]
或者,对于您的情况:
def __getitem__(self, key):
return self.list[key]
因为list
可以直接获取slice
对象。
在Python 2中,list.__getslice__
被调用为没有步幅的切片(因此只有启动和停止索引),如果实现了,内置的list
类型实现它,所以你必须覆盖那也是;对__getitem__
方法的简单授权应该没问题:
def __getslice__(self, i, j):
return self.__getitem__(slice(i, j))
答案 1 :(得分:4)
class MyList(list):
def __init__(self, lst):
self.list = lst
没有多大意义...... self
是列表对象本身,此时已经创建了它,也许你想覆盖__new__
,但是你可能不会需要触摸那个。无论如何你要覆盖__getitem__
,如下:
def __getitem__(self, val):
if isinstance( val, slice):
# do stuff here