Setitem и getitem - python

Я создал программу python, которая создает вектор. Теперь я хочу установить элемент с помощью функции __setitem__ и __getitem__. Так, например, если vector = Vec() и vector[3] = 26 изменили бы пустой вектор на [0, 0, 0, 26]. Мне нужно переопределить __getitem__ и __setitem__. Я перечислил приведенный ниже код, но у меня возникли проблемы с функциями get и set. Любые советы?

class Vec:
    def __init__(self, length = 0):
        self.vector = [0]*length

    def __str__(self):
        return '[{}]'.format(', '.join(str(i) for i in self.vector))
        #This formats the output according to the homework.
        #Adds '[' and ']' and commas between each 0

    def __len__(self):
        return len(self.vector)

    def extend(self, newLen):
        self.vector.append([0]*newLen)
        return (', '.join(str(j) for j in self.vector))

    def __setitem__(self, key, item):
        self.vector[key] = item

    def __getitem__(self, key):
        return self.vector[key]

Ответ 1

У вас есть несколько проблем:

  • extend добавляет по существу новый вектор к концу оригинала, а не увеличивает длину оригинала. Не ясно, что ему нужно вернуть строковое представление измененного вектора (если только он не предназначен для целей отладки).

    def extend(self, newlength):
        # Assume newlength is greater than the old
        self.vector.extend([0] * (newlength - len(self)))
    
  • __setitem__ необходимо вызвать extend, если ключ слишком большой.

    def __setitem__(self, key, item):
        if key >= len(self):
            self.vector.extend(key+1)
        self.vector[key] = item
    
  • __getitem__ должен получить доступ к базовому списку, а не использовать атрибут undefined

    def __getitem__(self, key):
        # It probably better to catch any IndexError to at least provide
        # a class-specific exception
        return self.vector[key]
    

Ответ 2

Проблема заключается в том, что созданный вами вектор не имеет длины из-за значения по умолчанию, указанного в аргументе length ключевого слова в определении метода __init__(). Попробуйте следующее:

vector = Vec(4)
vector[3] = 26
print vector  # --> [0, 0, 0, 26]

Ответ 3

Вам необходимо адаптировать ваши __getitem__ и __setitem__ для делегирования в базовый список:

def __setitem__(self, key, item):
    self.vector[key] = item 
    # return doesn't make sense here

def __getitem__(self, key):
    # not sure what self.__key is ? Let return value from index in `self.vector` instead
    return self.vector[key]