Хорошо, ты выглядишь очень решительным.Как я уже говорил выше, вы должны переопределить __getitem__
, __setitem__
и __delitem__
.На самом деле вам также придется переопределить __getslice__
, __setslice__
, __delslice__
(в противном случае срезы начинаются с 0, как обычно).Затем __add__
, __mul__
, __iadd__
, __imul__
также вернут WonkyList
s (иначе конкатенация не будет работать так, как вы хотите).Вам придется переопределить index
, потому что он вернет неправильное значение (я проверял это).Также insert
, remove
и pop
.Вот кое-что, с чего можно начать:
class WonkyList(list):
def __getitem__(self, index):
return super(WonkyList, self).__getitem__(index - 1)
def __setitem__(self, index, val):
super(WonkyList, self).__setitem__(index - 1, val)
def __delitem__(self, index):
super(WonkyList, self).__delitem__(index - 1)
Протестировано:
>>> w = WonkyList(range(10))
>>> w[1]
0
>>> del w[5]
>>> w
[0, 1, 2, 3, 5, 6, 7, 8, 9]
>>> w[1] = 10
>>> w
[10, 1, 2, 3, 5, 6, 7, 8, 9]
Вот несколько способов, которые могут привести к сбою, пока вы не переопределите все необходимые методы:
>>> w
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> w[5]
4
>>> w.pop(5)
5
>>> w.insert(5, 5)
>>> w
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del w[2:4]
>>> w
[0, 1, 4, 5, 6, 7, 8, 9]
>>>
>>> w.index(1)
1
Или вы можете попробовать что-нибудь еще.Рассматривали ли вы, например, ...
def ExtraItemList(list):
def __init__(self, seq):
self[0] = 0
self[1:] = seq
def n_items(self):
return len(self) - 1
Это, кажется, решает проблемы, которые вы перечисляете, и все еще ведет себя в основном как список, даже если инициализатор немного странный.Хотя, честно говоря, глядя на приведенные вами примеры, я начинаю чувствовать, что даже это уродливое решение - ни одна из функций, которые вы дали, не демонстрирует преимущества, начиная с индексации с 1, они просто показывают плохие эффекты добавлениядополнительный пункт в начале списка.Основываясь на этих примерах, вы должны просто использовать обычный список.
Возможно, лучшим подходом будет написать пользовательские методы get
и set
, которые используют желаемое смещение.Таким образом списки будут вести себя нормально, но при необходимости у вас будет альтернативный интерфейс.