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]