如何在其派生类中覆盖列表的切片功能

时间:2013-04-16 09:11:45

标签: python list override

我创建了如下课程:

class MyList(list):
    def __init__(self, lst):
        self.list = lst

我希望在MyList

中覆盖切片功能

2 个答案:

答案 0 :(得分:33)

您需要提供自定义__getitem__()__setitem____delitem__个钩子。

切片列表时传递slice object;它们具有startstopstep属性(可能是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