Подтвердить что ты не робот

Как переопределить функциональность среза списка в его производном классе

Я делаю класс, как показано ниже:

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

Я хочу, чтобы функция среза была переопределена в MyList

4b9b3361

Ответ 1

Вам необходимо предоставить пользовательский __getitem__(), __setitem__ и __delitem__.

Они передаются объект среза при разрезании списка; они имеют атрибуты start, stop и step (что может быть None):

def __getitem__(self, key):
    if isinstance(key, slice):
        return [self.list[i] for i in xrange(key.start, key.stop, key.step)]
    return self.list[key]

или, для вашего случая:

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

потому что a list может непосредственно взять объект slice.

В Python 2 list.__getslice__ вызывается для срезов без шага (так что только начальные и конечные индексы), если они реализованы, и встроенный -in list тип реализует его, поэтому вам придется переопределить это; простое делегирование вашему методу __getitem__ должно выполняться нормально:

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

Ответ 2

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

не имеет большого смысла... self - это сам объект списка, и он уже создан на этом этапе, возможно, вы хотите переопределить __new__, однако вам, вероятно, не нужно касаться этого, В любом случае вы хотите переопределить __getitem__ следующим образом:

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