gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:45:01 24 4
gpt4 key购买 nike

我做了一个如下的类:

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

我希望在 MyList 中覆盖切片功能

最佳答案

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

这些是通过 slice object切片列表时;它们具有 startstopstep 属性。但是,这些值可以是 None,以表示默认值。请注意,当您使用负步幅时,默认值实际上会发生变化!

但是,他们也有 slice.indices() method ,当给定一个长度时,它会生成一个适合于 range() 对象的 (start, stop, step) 值的元组。此方法处理诸如以负步幅进行切片且没有开始或停止索引等令人讨厌的细节:

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]

因为 list 可以直接获取 slice 对象。

在 Python 2 中,list.__getslice__如果实现,则调用没有跨步的切片(因此只有开始和停止索引),并且内置的 list 类型实现了它,因此您也必须覆盖它;对您的 __getitem__ 方法的简单委托(delegate)应该可以:

def __getslice__(self, i, j):
return self.__getitem__(slice(i, j))

关于python - 如何在其派生类中覆盖列表的切片功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16033017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com