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

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,stopstep属性(可能是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)

  • **精彩的答案。** 然而,应该注意的是,这是... *不完整。* 传递给 `__getitem__()` 的 `key` 也可以是包含一个或多个 `slice` 项的 `tuple` ,需要进行类似的处理。当然,`__setitem__()` 和 `__delitem__()` dunder 方法也需要类似的泛化。请参阅[此`MultiIndexingList`示例](https://riptutorial.com/python/example/1571/indexing-custom-classes----getitem------setitem---and---delitem-- )用于处理所有可能的边缘情况的相关子类逻辑。 (2认同)

jam*_*lak 6

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)