Python 如何在其派生类中重写list的切片功能

Python 如何在其派生类中重写list的切片功能,python,list,overriding,Python,List,Overriding,我做了一个如下的课程: class MyList(list): def __init__(self, lst): self.list = lst 我希望在MyList中覆盖切片功能,您需要提供自定义和挂钩 在对列表进行切片时,会传递这些信息;它们具有开始、停止和步骤属性。但是,这些值可以是None,以表示默认值。考虑到使用负步幅时默认值实际上会发生变化 但是,它们也有一个数组,当给定一个长度时,它会生成一个适合范围()对象的(开始、停止、步骤)值的元组。这种方法处理了一

我做了一个如下的课程:

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

我希望在MyList中覆盖切片功能,您需要提供自定义和挂钩

在对列表进行切片时,会传递这些信息;它们具有
开始
停止
步骤
属性。但是,这些值可以是
None
,以表示默认值。考虑到使用负步幅时默认值实际上会发生变化

但是,它们也有一个数组,当给定一个长度时,它会生成一个适合
范围()
对象的
(开始、停止、步骤)
值的元组。这种方法处理了一些烦人的细节,比如以负步长进行切片,并且没有开始或停止索引:

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]
因为
列表
可以直接获取
切片
对象

在Python2中,如果实现,则为没有跨步的切片(因此只有开始和停止索引)调用,而内置的
list
类型实现了它,因此您也必须覆盖它;对
\uuu getitem\uuu
方法进行简单的委托应该可以:

def __getslice__(self, i, j):
    return self.__getitem__(slice(i, j))
没有什么意义
self
是列表对象本身,此时已经创建了它,您可能希望覆盖
\uuuu new\uuuu
,但是您可能不需要触摸它。不管怎样,您都希望覆盖
\uuuu getitem\uuuu
,如下所示:

def __getitem__(self, val):
    if isinstance( val, slice):
        # do stuff here

回答得很好。然而,应该注意的是,这是。。。不完整。传递给
也可以是一个
元组
,其中包含一个或多个
切片
项,需要进行类似的处理。当然,dunder方法的
\uuuuu setitem\uuuuuuuu()
\uuuu delitem\uuuuuuuuuu()
也需要类似的泛化。有关处理所有可能的边缘情况的相关子类逻辑,请参阅。@CecilCurry我特别关注Python列表的切片方式。扩展切片不是由标准列表类型处理的,这就是为什么我忽略了它。
def __getitem__(self, val):
    if isinstance( val, slice):
        # do stuff here