Добрых суток. Есть класс с контейнером. Хочу сделать срез с экземпляра класса, как если бы обратился к списку. Как это можно реализовать не наследуясь от класса list, а возможно, с помощью магических методов?
class L:
def __init__(self):
self.__lst = []
l = L()
l[:]
Ответ
Срез реализуется через метод __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: Всё, что Вы хотели знать о слайсах
Комментариев нет:
Отправить комментарий