Erreur python 3.11 Programmation Objet
Fermé
haleyy1717
-
Modifié le 17 mars 2023 à 16:34
mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 - 17 mars 2023 à 16:46
mamiemando Messages postés 33459 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 janvier 2025 - 17 mars 2023 à 16:46
A voir également:
- Erreur python 3.11 Programmation Objet
- Erreur 0x80070643 - Accueil - Windows
- Vente objet occasion entre particulier - Guide
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Citizen code python avis - Accueil - Outils
- Application de programmation - Guide
3 réponses
Bonsoir, en python self dans une classe est une référence à l'objet.
Tu l'écrases par une liste dans l'__init__, déjà ça pose problème, puis tu refais le même genre d'erreur juste après.
def contenu(self): return list(self) def creerPileVide(): self.contenu = []
Tu écrases la méthode contenu par une liste.
Tu devrais revoir les bases des classes en python.
Cela reste tout même complexe pour faire un simple calcul que l'on peut faire en une 30aine de ligne, utiliser une classe Pile pour finalement n'être qu'un interface à une liste python n'a pas d'utilité.
class Operation: def __init__(self): self.pile = [] self.resultat = 0 self.operations = { '+':self.additionner, '*':self.multiplier, } def calculer(self, valeur): for element in valeur: if type(element) == int: self.pile.append(element) elif element in self.operations: self.operations[element]() else: raise ValueError(f'valeur {valeur} est invalide') return self.resultat def additionner(self): for v in self.pile: self.resultat += v self.pile.clear() def multiplier(self): n = self.pile[0] for v in self.pile[1:]: n *= v self.resultat += n self.pile.clear() operation = Operation() print(operation.calculer([2, 3, '*', 5, '+']))
mamiemando
Messages postés
33459
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 janvier 2025
7 813
Modifié le 17 mars 2023 à 16:51
Modifié le 17 mars 2023 à 16:51
Bonjour,
Plusieurs suggestions :
- Comme le dit figro, ton constructeur est incohérent. Une manière de résoudre ton problème serait de faire hériter Pile de list.
- creerPileVide devrait être une méthode statique (cf décorateur @staticmethod).
- les notations manquent de cohérence (tant maMethode, tantôt ma_methode)
- si on omet l'aspect pédagogique, je suis un peu sceptique sur l'implémentation de certaines primitive de ta classe Pile qui, si on en a besoin, signifient probablement qu'on ne devrait pas utiliser une Pile mais une structure plus évoluée (par exemple une liste avec en tandem les fonction sorted et max)
- ce qui est à gauche d'un point doit être un espace de nommage, une classe, ou une instance de classe. Or dans ton erreur, c'est une fonction.
- Il existe des manières bien plus naturelles d'implémenter une pile en python (voir ce lien)
- est_vide devient alors peu inutile : en python un ensemble vide correspond à faux dans un test. Si ta classe Pile hérite d'une de ces classes, alors tu peux parfaitement écrire :
pile = Pile(...) ... if pile: print(f"Pile {pile} non vide") else: print(f"Pile {pile} vide")
- est_vide devient alors peu inutile : en python un ensemble vide correspond à faux dans un test. Si ta classe Pile hérite d'une de ces classes, alors tu peux parfaitement écrire :
Bonne chance