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

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

Этот вопрос предполагает, что по крайней мере __ getslice__ необходимо переопределить. Из дальнейшего исследования также потребуются __ 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 ?

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

33
задан Community 23 May 2017 в 12:02
поделиться