Как подклассифицировать список Python без проблем типа?

Я хочу реализовать собственный класс списка в Python в качестве подкласса list . Каков минимальный набор методов, которые мне нужно переопределить из класса базового list , чтобы получить полную совместимость типов для всех операций с списками?

Этот вопрос предполагает, что по крайней мере __getslice__ необходимо переопределить. Из дальнейших исследований также __mul__ __add__ и __mul__ . Итак, у меня есть этот код:

 class CustomList(list): def __getslice__(self,i,j): return CustomList(list.__getslice__(self, i, j)) def __add__(self,other): return CustomList(list.__add__(self,other)) def __mul__(self,other): return CustomList(list.__mul__(self,other)) 

Следующие утверждения работают по желанию, даже без переопределяющих методов:

 l = CustomList((1,2,3)) l.append(4) l[0] = -1 l[0:2] = CustomList((10,11)) # type(l) is CustomList 

Эти утверждения работают только с переопределяющими методами в приведенном выше определении класса:

 l3 = l + CustomList((4,5,6)) # type(l3) is CustomList l4 = 3*l # type(l4) is CustomList l5 = l[0:2] # type(l5) is CustomList 

Единственное, чего я не знаю, как добиться, – это сделать расширенную нарезку верным правилом:

 l6 = l[0:2:2] # type(l6) is list 

Что мне нужно добавить к определению моего класса, чтобы получить CustomList как тип l6 ?

Кроме того, существуют ли другие операции с списками, отличные от расширенного среза, где результат будет иметь тип list вместо CustomList ?

2 Solutions collect form web for “Как подклассифицировать список Python без проблем типа?”

Во-первых, я рекомендую вам следовать совету Björn Pollex (+1).

Чтобы преодолеть эту конкретную проблему ( type(l2 + l3) == CustomList ), вам необходимо реализовать пользовательский __add__() :

  def __add__(self, rhs): return CustomList(list.__add__(self, rhs)) 

И для расширенной нарезки :

  def __getitem__(self, item): result = list.__getitem__(self, item) try: return CustomList(result) except TypeError: return result 

Я также рекомендую …

 pydoc list 

… в командной строке. Вы увидите, какой list методов выставляет, и это даст вам хорошее представление о том, какие из них вам нужно переопределить.

Вероятно, вы должны прочитать эти два раздела из документации:

  • Эмуляция типов контейнеров
  • Дополнительные методы для эмуляции типов последовательностей (только для Python 2)

Изменить. Чтобы обработать расширенную нарезку, вы должны сделать свой __getitem__ обработанными __getitem__ (см. __getitem__ ниже).

  • Списки Python со скандинавскими буквами
  • Достаточно распечатать список в табличном формате
  • Первые позиции во внутреннем списке максимально эффективно
  • Python sort () первый элемент списка
  • Python: как преобразовать список значений словарей в int / float из строки?
  • Перемещение списка списков по индексу в цикле, переформатирование строк
  • Списки сумм различной длины
  • Может ли список, набор или словарь Python быть реализован невидимо с помощью базы данных?
  • Умножение списка Python: ] * 3 делает 3 списка, которые зеркально отражают друг друга при изменении
  • Быстрый способ пересечения строк в списке
  • Как сделать итератор python назад?
  • Python - лучший язык программирования в мире.