Customize Python Slicing, please advise

后端 未结 1 452
别跟我提以往
别跟我提以往 2021-01-12 11:13

I have a class that subclasses the list object. Now I need to handle slicing. From everything I read on the intertubes this has to be done using the __getitem__

相关标签:
1条回答
  • 2021-01-12 12:04

    See this note:

    object.__getslice__(self, i, j)

    Deprecated since version 2.0: Support slice objects as parameters to the __getitem__() method. (However, built-in types in CPython currently still implement __getslice__(). Therefore, you have to override it in derived classes when implementing slicing.

    So, because you subclass list you have to overwrite __getslice__, even though it's deprecated.

    I think you should generally avoid subclassing builtins, there are too many weird details. If you just want a class that behaves like a list, there is a ABC to help with that:

    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)
    
    0 讨论(0)
提交回复
热议问题