Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
335 views
in Technique[技术] by (71.8m points)

python - How to override the slice functionality of list in its derived class

I make a class like below:

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

I want slice functionality to be overridden in MyList

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You need to provide custom __getitem__(), __setitem__ and __delitem__ hooks.

These are passed a slice object when slicing the list; these have start, stop and step attributes. However, these values could be None, to indicate defaults. Take into account that the defaults actually change when you use a negative stride!

However, they also have a slice.indices() method, which when given a length produces a tuple of (start, stop, step) values suitable for a range() object. This method takes care of such pesky details as slicing with a negative strides and no start or stop indices:

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]

or, for your case:

def __getitem__(self, key):
    return self.list[key]

because a list can take the slice object directly.

In Python 2, list.__getslice__ is called for slices without a stride (so only start and stop indices) if implemented, and the built-in list type implements it so you'd have to override that too; a simple delegation to your __getitem__ method should do fine:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...