Как подклассифицировать список 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)
  • Как группировать / подсчитывать элементы списка по диапазону
  • Самый эффективный способ поиска в списке dicts
  • Срезание списка с динамическим индексом в
  • проблема Удаление элементов списка в цикле for (python)
  • django - преобразовать список обратно в запрос
  • Как я могу умножить все элементы в списке вместе с Python?
  • Использовать endswith с несколькими расширениями
  • Python - лучший язык программирования в мире.