J'ai créé un programme python qui crée un vecteur. Maintenant, je veux définir un élément en utilisant une fonction__setitem__
et__getitem__
. Ainsi, par exemple, ifvector = Vec()
andvector[3] = 26
changerait un vecteur vide en[0, 0, 0, 26]
. Je dois remplacer le__getitem__
et__setitem__
J'ai répertorié le code ci-dessous, mais j'ai des problèmes avec les fonctions get et set. Aucun conseil?
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]
Vous avez plusieurs problèmes:
extend
ajoute essentiellement un nouveau vecteur à la fin de l'original, plutôt que d'augmenter la longueur de l'original. Il n'est pas clair qu'il doive renvoyer une représentation sous forme de chaîne du vecteur modifié (sauf si c'est uniquement à des fins de débogage).
def extend(self, newlength):
# Assume newlength is greater than the old
self.vector.extend([0] * (newlength - len(self)))
__setitem__
doit appeler extend
si la clé est trop grande.
def __setitem__(self, key, item):
if key >= len(self):
self.vector.extend(key+1)
self.vector[key] = item
__getitem__
doit accéder à la liste sous-jacente, ne pas utiliser d'attribut non défini
def __getitem__(self, key):
# It's probably better to catch any IndexError to at least provide
# a class-specific exception
return self.vector[key]
Le problème est que le vecteur que vous avez créé n'a pas de longueur en raison de la valeur par défaut étant donné l'argument du mot clé length
dans la définition de méthode __init__()
. Essaye ça:
vector = Vec(4)
vector[3] = 26
print vector # --> [0, 0, 0, 26]
Vous devez adapter vos __getitem__
et __setitem__
à déléguer à la liste sous-jacente:
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's return value from index in `self.vector` instead
return self.vector[key]
Ce serait plus facile dans __str__
si vous faites cela
return str(self.vector)