自定义Python切片,请指教

时间:2011-02-24 23:51:04

标签: python list slice

我有一个继承列表对象的类。现在我需要处理切片。从我在intertubes上读到的所有内容来看,这必须使用__getitem__方法完成。至少在我正在使用的Python 2.7+中。我已经完成了这个(见下文),但是当我传入切片时没有调用__getitem__方法。而是完成切片并返回列表。我想返回一个新的myList实例。

请帮我发现错误。

谢谢!

class myList(list):

    def __init__(self, items):

        super(myList, self).__init__(items)
        self.name = 'myList'


    def __getitem__(self, index):

        print("__getitem__")
        if isinstance(index, slice):
            print("slice")
            return self.__class__(
                self[x] for x in range(*index.indices(len(self)))
                )
        else: return super(myList, self).__getitem__(index)

if __name__ == "__main__":
    print("\nI'm tesing out custom slicing.\n")

    N = 10
    L = myList(range(N))

    L3 = L[3]
    L02 = L[:2]

1 个答案:

答案 0 :(得分:17)

请参阅this note

  

object.__getslice__(self, i, j)

     

自2.0版以来不推荐使用:支持   切片对象作为参数   __getitem__()方法。 (但是,目前CPython中的内置类型   仍然实施__getslice__()。   因此,您必须覆盖它   实现时的派生类   切片。

所以,因为你是list的子类,你必须覆盖__getslice__,即使它已被弃用。

我认为你通常应该避免对内置类进行子类化,有太多奇怪的细节。如果您只想要一个行为类似于列表的类,可以使用ABC来帮助解决这个问题:

from collections import Sequence

class MyList(Sequence):
    def __init__(self, *items):
        self.data = list(items)

    def __len__(self):
        return len(self.data)

    def __getitem__(self, slice):
        return self.data[slice]

s = MyList(1,2,3)
# lots of free methods
print s[1:2], len(s), bool(s), s.count(3), s.index(2), iter(s)