Abh*_*rma 20 python overriding list
我做了如下课程:
class MyList(list):
def __init__(self, lst):
self.list = lst
Run Code Online (Sandbox Code Playgroud)
我希望在MyList中覆盖切片功能
Mar*_*ers 34
您需要提供自定义的__getitem__(),__setitem__和__delitem__挂钩.
在切片列表时传递切片对象 ; 这些有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]
Run Code Online (Sandbox Code Playgroud)
或者,对于您的情况:
def __getitem__(self, key):
return self.list[key]
Run Code Online (Sandbox Code Playgroud)
因为a list可以slice直接获取对象.
在Python 2中,list.__getslice__如果实现了,则调用没有步幅的切片(因此只有启动和停止索引),内置list类型实现它,所以你也必须覆盖它; 对您的__getitem__方法的简单委托应该没问题:
def __getslice__(self, i, j):
return self.__getitem__(slice(i, j))
Run Code Online (Sandbox Code Playgroud)
class MyList(list):
def __init__(self, lst):
self.list = lst
Run Code Online (Sandbox Code Playgroud)
没有多大意义...self是列表对象本身,此时它已经创建,也许您想覆盖__new__,但是您可能不需要触摸它。无论如何你想像这样覆盖__getitem__:
def __getitem__(self, val):
if isinstance( val, slice):
# do stuff here
Run Code Online (Sandbox Code Playgroud)