Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Перегрузка операторов: как сделать срез списка?

#python


Добрых суток. Есть класс с контейнером. Хочу сделать срез с экземпляра класса, как
если бы обратился к списку. Как это можно реализовать не наследуясь от класса list,
а возможно, с помощью магических методов?     

class L:
    def __init__(self):
        self.__lst = []

l = L()
l[:]

    


Ответы

Ответ 1



Срез реализуется через метод __getitem__ (тот же метод, что и для взятия элемента по индексу). При выполнении среза в этот метод передается специальный объект класса slice. Пример реализации: class L: def __init__(self, lst=None): if not lst: self.__lst = [] else: self.__lst = lst def __getitem__(self, item): if isinstance(item, slice): # Создание нового объекта данного класса с элементами среза внутреннего списка return self.__class__(self.__lst[item.start:item.stop:item.step]) # или return self.__class__(self.__lst[item])) else: return L.__lst[item] def __repr__(self): return 'L(%r)' % self.__lst x = L(list(range(10))) print(x) # Вывод: L([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) print(x[2:5]) # Вывод: L([2, 3, 4]) Присваивание срезу и удаление среза реализуется аналогично с помощью методов __setitem__ и __delitem__. Доп. информация: Habrahabr: Всё, что Вы хотели знать о слайсах

Ответ 2



class L: def __getitem__(self, i): # Перегружаем [] if isinstance(i, slice): # Проверяем на срез ... # Необходимые действия return self.__lst[i]

Комментариев нет:

Отправить комментарий