Chers, j'essaie de mieux comprendre le paradigme de la POO en Python, j'ai donc créé cette classe simple
list1[0]=5
Jusqu'à ce que tout va bien, le problème se produit lorsque j'essaie de définir une valeur pour n'importe quel élément de ma liste. Comme exemple:
class MyList: def __init__(self,list): self.list=list list1=MyList([1,2,3,4,5])
Ensuite, j'ai eu cette TypeError: l'objet 'MyList' ne prend pas en charge l'attribution d'éléments
Quelqu'un pourrait m'aider avec ça?
5 Réponses :
Vous n'avez aucun code dans la classe qui permet l'attribution d'éléments. Pour qu'un objet autorise l'attribution d'éléments, il doit implémenter __setitem__
.
Vous auriez besoin de quelque chose comme:
class MyList: def __init__(self,list): self.list=list def __setitem__(self, i, elem): self.list[i] = elem
Salut Carcigenicate, merci pour votre soutien. J'ai déjà essayé cela mais j'obtiens ce même message d'erreur ...
@blhsing je l'ai fait, mais pour une raison quelconque, j'avais des recherches dans ma tête pendant que j'écrivais la seconde moitié. Je ne sais pas pourquoi. Fixé.
@ViniciusMiki J'ai eu la mauvaise méthode. Je l'ai écrit en écoutant une conférence et évidemment mon cerveau a été distrait. Essayez le code corrigé.
class MyList: def __init__(self,list): self.list=list def __str__(self): return str(self.__dict__) list1=MyList([1,2,3,4,5]) print(list1) list1.list[0]=5 print(list1) You need to assign to the list attribute not to the class
Puisque vous essayez de mieux comprendre la POO, voici quelque chose que vous pouvez essayer: La list
sous-classes elle-même, afin que votre classe obtienne toutes les propriétés que les list
font.
class MyList(list): def __init__(self,list): super().__init__(list) list1 = MyList([1,2,3,4,5]) list1[0] = 5 print(list1) # [5, 2, 3, 4, 5]
Vous essayez probablement de créer un nouveau type MyList qui devrait avoir les fonctionnalités d'une liste Python normale ainsi que certaines fonctionnalités que vous aimeriez ajouter ou modifier. Pour que cela fonctionne, vous devez hériter de la classe de list
Python intégrée, comme ceci,
class MyList(list): pass list1=MyList([1,2,3,4,5]) list1[0]=5
Maintenant, dans votre classe MyList
, définissez uniquement les méthodes que vous souhaitez modifier dans la classe de list
intégrée
J? ai compris! J'ai implémenté la méthode spéciale setitem et getitem et cela a fonctionné. Merci à tous
class MyList: def __init__(self,list): self.list=list def __getitem__(self, index): return self.list[index] def __setitem__(self, index, value): self.list[index] = value
list1.list[0]=5
Vous devez accéder à l'attributlist
carlist1
n'est pas unelist
, c'est une instanceMyList
.Vous voudrez peut-être implémenter des "méthodes magiques" comme
__getitem__
et__setitem__
.Voir Émulation des types de conteneurs
Est-ce que cela répond à votre question? Accès au nom d'une liste en définissant une nouvelle classe, erreur: l'instance NamedList n'a pas d'attribut '__len__'
Est-ce que cela répond à votre question? Implémentation __setitem__ en Python pour la classe Point (x, y)
Pourquoi vous attendez-vous à ce que
MyList
en charge l'attribution d'articles? Le code affiché ne définit aucune opération de ce type.