Explication Méthodes Magiques Python
Explication Méthodes Magiques Python
salut s'il te plait peut tu me dire en python dans la notion de class , que signifie self._name = name ?
et a quoi sert les methodes magic , donne moi un exemple explicatif de chaque methode magic
`self` : fait référence à l'instance actuelle de la classe. Il est utilisé pour accéder aux attributs et
méthodes de l'objet.
`_name` : convention pour indiquer que cet attribut est "privé" ou destiné à un usage interne. Ce
n'est pas réellement privé en Python (comme dans certains langages), mais c'est une manière de
signaler qu'il ne faut pas l'utiliser directement en dehors de la classe.
`name` : correspond à un paramètre transmis au constructeur (`__init__`), qui est utilisé pour
initialiser l'attribut `_name`.
Exemple simple :
python
class Person:
def __init__(self, name):
self._name = name # Stocke la valeur passée en paramètre dans l'attribut _name
def display_name(self):
return f"Le nom est {self._name}"
# Utilisation
person = Person("Alice")
print(person.display_name()) # Output : Le nom est Alice
Les méthodes magiques (ou "dunder methods" pour duble underscore) sont des méthodes spéciales
que Python utilise pour implémenter certains comportements prédéfinis des objets. Ces méthodes
permettent de surcharger des opérateurs ou de personnaliser certains aspects du comportement d'une
classe.
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 1/27
5. Gérer l'accès aux attributs : `__getattr__`, `__setattr__`, `__delattr__`
6. Personnaliser des conteneurs : `__getitem__`, `__setitem__`, `__len__`
3. Exemples explicatifs :
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}, {self.age} ans"
# Utilisation
person = Person("Alice", 30)
print(person) # Output : Alice, 30 ans
python
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Point({self.x}, {self.y})"
# Utilisation
p1 = Point(1, 2)
p2 = Point(3, 4)
result = p1 + p2
print(result) # Output : Point(4, 6)
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 2/27
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# Utilisation
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
print(p1 == p2) # Output : False
print(p1 < p2) # Output : False
print(p2 < p1) # Output : True
python
class Team:
def __init__(self, members):
self.members = members
# Utilisation
team = Team(["Alice", "Bob", "Charlie"])
print(team[1]) # Output : Bob
Ces méthodes magiques rendent vos classes Python plus puissantes et intuitives ! 😊
j'aimerais que tu me donne un exemple d'usage de chaque methode magic en python essentiel que
tu as sité
Voici un exemple d'utilisation pour chaque méthode magique essentielle que j'ai mentionnée :
1. `__init__` et `__new__`
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 3/27
python
class MyClass:
def __new__(cls, *args, **kwargs):
print("Appel à __new__ pour créer une instance")
instance = super().__new__(cls)
return instance
# Utilisation
obj = MyClass(42)
2. `__str__` et `__repr__`
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}, {self.age} ans"
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
# Utilisation
person = Person("Alice", 30)
print(str(person)) # Output : Alice, 30 ans
print(repr(person)) # Output : Person(name=Alice, age=30)
python
class Box:
def __init__(self, volume):
self.volume = volume
# Utilisation
box1 = Box(10)
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 4/27
box2 = Box(20)
print(box1 == box2) # Output : False
print(box1 < box2) # Output : True
print(box1 > box2) # Output : False
python
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Vector({self.x}, {self.y})"
# Utilisation
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Output : Vector(4, 6)
print(v1 - v2) # Output : Vector(-2, -2)
print(v1 * 3) # Output : Vector(3, 6)
python
class CustomList:
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
# Utilisation
cl = CustomList([10, 20, 30])
print(cl[1]) # Output : 20
cl[1] = 50
print(cl[1]) # Output : 50
print(len(cl)) # Output : 3
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 5/27
6. `__getattr__`, `__setattr__`, `__delattr__`
python
class DynamicAttributes:
def __getattr__(self, name):
return f"L'attribut '{name}' n'existe pas !"
# Utilisation
obj = DynamicAttributes()
print(obj.some_attribute) # Output : L'attribut 'some_attribute' n'existe pas !
obj.new_attribute = 42 # Output : Attribuer 42 à l'attribut 'new_attribute'
del obj.new_attribute # Output : Suppression de l'attribut 'new_attribute'
7. `__call__`
python
class CallableObject:
def __init__(self, value):
self.value = value
# Utilisation
obj = CallableObject(5)
print(obj(3)) # Output : 15
8. `__enter__` et `__exit__`
python
class Resource:
def __enter__(self):
print("Acquisition de la ressource")
return self
# Utilisation
with Resource():
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 6/27
print("Utilisation de la ressource")
# Output :
# Acquisition de la ressource
# Utilisation de la ressource
# Libération de la ressource
9. `__del__`
python
class Demo:
def __del__(self):
print("Objet détruit")
# Utilisation
obj = Demo()
del obj # Output : Objet détruit
Ces exemples couvrent les méthodes magiques essentielles pour exploiter pleinement le potentiel des
classes en Python. 😊
donc lorsque cette syntaxe est utiliser self._name = name , la variable ne peut pas être utiliser dans
une instance ou quoi ?
Quand on utilise la syntaxe `self._name = name` dans une classe Python, l'attribut `_name` n'est pas
réellement "privé". Il peut tout à fait être utilisé ou modifié depuis une instance. La convention d'utiliser
un underscore (`_`) au début du nom sert simplement à indiquer aux autres développeurs que cet
attribut est destiné à un usage interne à la classe et qu'il ne doit pas être accédé directement sans une
bonne raison.
Exemple d'utilisation :
python
class Person:
def __init__(self, name):
self._name = name # Convention : Attribut à usage interne
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 7/27
Pourquoi utiliser un underscore ?
L'idée est d'encourager les développeurs à accéder à l'attribut via des méthodes publiques (comme des
getters ou setters) plutôt qu'en accédant directement à l'attribut interne. Cela permet de mieux
contrôler son accès ou sa modification, et d'ajouter des vérifications ou des transformations si
nécessaire.
python
class Person:
def __init__(self, name):
self._name = name # Attribut interne
def get_name(self):
return self._name
# Utilisation
person = Person("Alice")
print(person.get_name()) # Output : Alice
person.set_name("Bob")
print(person.get_name()) # Output : Bob
Si vous voulez vraiment restreindre l'accès direct, Python fournit une autre convention : les doubles
underscores (`__`). Cela active un mécanisme appelé name mangling (modification de nom). L'attribut
sera rendu inaccessible directement sous son nom original depuis l'extérieur.
python
class Person:
def __init__(self, name):
self.__name = name # Attribut "privé"
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 8/27
# Mais il est accessible via le nom "manglé"
print(person._Person__name) # Output : Alice
Note : Même avec les doubles underscores, l'attribut reste techniquement accessible, mais il est
intentionnellement rendu plus difficile à manipuler.
Conclusion :
Avec `_name`, vous indiquez que l'attribut est "interne" mais toujours accessible directement.
Avec `__name`, vous activez le name mangling, mais cela n'est pas une véritable sécurité, juste une
barrière supplémentaire.
La meilleure pratique est d'utiliser des méthodes publiques (getters et setters) pour gérer ces
attributs sensibles.
donc si je comprend les methode magic , permet tout simplementer d'eviter l'appele d'une methode
via son nom lors de son usage , dans la creation d'une instance ?
Comment ça fonctionne :
Les méthodes magiques sont invoquées automatiquement par Python lorsqu'un événement particulier
se produit. Voici quelques exemples courants pour illustrer cela :
python
obj = MaClasse("valeur")
python
class MaClasse:
def __init__(self, valeur):
self.valeur = valeur
print(f"Instance créée avec valeur : {self.valeur}")
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 9/27
# Création d'une instance
obj = MaClasse("Bonjour") # Automatiquement, __init__ est invoqué
# Output : Instance créée avec valeur : Bonjour
python
print(obj)
Python appelle automatiquement `__str__` pour afficher une représentation lisible de l'objet. Si
`__str__` n'est pas défini, il essaie avec `__repr__`.
python
class MaClasse:
def __init__(self, valeur):
self.valeur = valeur
def __str__(self):
return f"MaClasse contenant : {self.valeur}"
# Utilisation
obj = MaClasse("Python")
print(obj) # Automatiquement, __str__ est invoqué
# Output : MaClasse contenant : Python
python
Python appelle automatiquement la méthode `__add__` pour définir comment les deux objets doivent
être additionnés.
python
class Nombre:
def __init__(self, valeur):
self.valeur = valeur
def __str__(self):
return str(self.valeur)
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 10/27
# Utilisation
n1 = Nombre(5)
n2 = Nombre(10)
result = n1 + n2 # Automatiquement, __add__ est invoqué
print(result) # Output : 15
python
valeur = mon_objet[cle]
mon_objet[cle] = valeur
python
class Tableau:
def __init__(self):
self.donnees = {}
# Utilisation
t = Tableau()
t["nom"] = "Alice" # Automatiquement, __setitem__ est invoqué
print(t["nom"]) # Automatiquement, __getitem__ est invoqué
# Output : Alice
python
result = mon_objet(arg)
python
class Multiplieur:
def __init__(self, facteur):
self.facteur = facteur
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 11/27
return valeur * self.facteur
# Utilisation
m = Multiplieur(3)
print(m(10)) # Automatiquement, __call__ est invoqué
# Output : 30
python
with mon_objet:
# bloc de code
python
class Ressource:
def __enter__(self):
print("Ressource acquise")
return self
# Utilisation
with Ressource():
print("Utilisation de la ressource")
# Output :
# Ressource acquise
# Utilisation de la ressource
# Ressource libérée
Résumé :
1. D'éviter d'appeler explicitement une méthode (elles sont déclenchées automatiquement par
Python selon le contexte).
2. De rendre les objets plus naturels à utiliser, en les intégrant dans les comportements natifs de
Python (comme les opérateurs, les conteneurs, les contextes, etc.).
Ainsi, elles offrent une manière puissante et élégante de personnaliser le comportement de tes classes !
😊
mais dire moi est-ce que nous meme nous pouvons crée des methode magic ?
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 12/27
Non, nous ne pouvons pas créer nos propres méthodes magiques en Python. Les méthodes
magiques (ou dunder methods, pour "double underscore") sont prédéfinies par le langage Python, et
leur usage est limité à ce qui est déjà prévu dans la documentation officielle.
Cependant, tu peux :
1. Utiliser les méthodes magiques existantes et les surcharger pour personnaliser leur
comportement.
2. Créer des méthodes normales (avec des noms sans underscores) pour d'autres usages
spécifiques.
Les méthodes magiques sont intégrées directement au langage Python. Elles sont liées à des
fonctionnalités internes du langage (comme l'affichage, les opérateurs, ou les conteneurs). Python ne
reconnaît pas une méthode comme "magique" simplement parce qu'elle a un nom en double
underscore (`__ma_methode__`). Elle doit être spécifiquement définie dans l'interpréteur Python pour
fonctionner automatiquement dans un contexte particulier.
Si tu as besoin d'un comportement personnalisé, tu peux simplement définir des méthodes normales
dans ta classe, sans utiliser la convention des underscores. Par exemple :
python
class MyClass:
def custom_method(self):
print("Ceci est une méthode personnalisée.")
# Utilisation
obj = MyClass()
obj.custom_method() # Output : Ceci est une méthode personnalisée.
Tu peux définir une méthode normale et l'appeler explicitement dans ton code. Par exemple, si tu veux
simuler une sorte de "magie", tu pourrais l'invoquer dans le bon contexte ou en combinaison avec une
méthode magique existante.
Exemple :
python
class MyClass:
def __init__(self, value):
self.value = value
def __call__(self):
print("Méthode magique __call__ utilisée")
self.custom_magic()
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 13/27
def custom_magic(self):
print(f"Comportement personnalisé avec la valeur {self.value}")
# Utilisation
obj = MyClass(42)
obj() # Appelle automatiquement __call__, qui à son tour appelle custom_magic
# Output :
# Méthode magique __call__ utilisée
# Comportement personnalisé avec la valeur 42
Conclusion :
Tu ne peux pas créer de nouvelles méthodes magiques, mais tu peux utiliser celles existantes pour
rendre tes classes plus puissantes et intuitives. Si nécessaire, combine-les avec des méthodes normales
pour obtenir un comportement complexe et adapté à ton projet.
mais dire moi qu'elle sont les methodes magic essentiel que je peut utiliser ainsi que leurs exemple
d'usage ?
Voici une liste des méthodes magiques essentielles en Python avec leur usage et un exemple clair
pour chacune. Ces méthodes couvrent les cas d'utilisation les plus courants et utiles dans la
programmation orientée objet.
1. `__init__` (Constructeur)
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
python
class Person:
def __init__(self, name):
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 14/27
self.name = name
def __str__(self):
return f"Person: {self.name}"
def __repr__(self):
return f"Person(name={self.name!r})"
person = Person("Alice")
print(str(person)) # Output : Person: Alice
print(repr(person)) # Output : Person(name='Alice')
python
class Multiplier:
def __init__(self, factor):
self.factor = factor
multiply_by_2 = Multiplier(2)
print(multiply_by_2(5)) # Output : 10
python
class CustomList:
def __init__(self):
self.items = []
my_list = CustomList()
my_list.items.append(10)
my_list[0] = 20
print(my_list[0]) # Output : 20
del my_list[0]
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 15/27
python
class CustomCollection:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
python
class Number:
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
n1 = Number(5)
n2 = Number(10)
n3 = n1 + n2 # Appelle __add__
print(n3) # Output : 15
python
class Number:
def __init__(self, value):
self.value = value
n1 = Number(5)
n2 = Number(5)
print(n1 == n2) # Output : True
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 16/27
python
class Resource:
def __enter__(self):
print("Ressource acquise")
return self
with Resource():
print("Utilisation de la ressource")
# Output :
# Ressource acquise
# Utilisation de la ressource
# Ressource libérée
9. `__del__` (Destructeur)
python
class Person:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"{self.name} a été détruit.")
person = Person("Alice")
del person # Output : Alice a été détruit.
python
class MyObject:
def __init__(self, value):
self.value = value
def __bool__(self):
return self.value > 0
obj = MyObject(5)
if obj:
print("L'objet est vrai") # Output : L'objet est vrai
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 17/27
python
class MyRange:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current >= self.end:
raise StopIteration
value = self.current
self.current += 1
return value
Méthode Utilisation
`__init__` Initialisation d'un objet
`__str__` Représentation lisible
`__repr__` Représentation technique
Ces méthodes magiques te permettent de créer des classes puissantes et intuitives qui s'intègrent
parfaitement avec les fonctionnalités natives de Python. 😊
mais dire moi comment ajouter un nouveau element dans un dictionnaire en python , a travers un
mot clé integré ?
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 18/27
En Python, pour ajouter un nouvel élément dans un dictionnaire, tu peux utiliser le mot-clé intégré
`update()`. Ce mot-clé permet d'ajouter une clé et une valeur, ou même plusieurs paires clé-valeur en
une seule fois, au dictionnaire.
Syntaxe de `update()` :
python
mon_dictionnaire.update({nouvelle_cle: nouvelle_valeur})
python
# Dictionnaire initial
mon_dictionnaire = {"nom": "Alice", "age": 25}
print(mon_dictionnaire)
# Output : {'nom': 'Alice', 'age': 25, 'ville': 'Paris'}
python
print(mon_dictionnaire)
# Output : {'nom': 'Alice', 'age': 25, 'ville': 'Paris', 'profession': 'Développeuse'}
En plus de `update()`, tu peux aussi ajouter un élément en assignant directement une valeur à une
nouvelle clé :
python
# Ajout direct
mon_dictionnaire["ville"] = "Paris"
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 19/27
print(mon_dictionnaire)
# Output : {'nom': 'Alice', 'age': 25, 'ville': 'Paris'}
mais dire moi dans cet exemple , où est-ce que je peut utiliser __str__ ? : class Parent:
def __init__(self,name,children):
self.name = name
self.children = children
def ParentName(self):
return print(f"Hello i'm a parent , my name is {self.name}")
def ParentChildren(self):
return print(f"I've {self.children} children")
class FirstChild(Parent):
def __init__(self, name,childName,children):
super().__init__(name,children)
self.childName = childName
def DisplayChild(self):
super().ParentName()
super().ParentChildren()
return print(
f"""
Hello friend , my full name is {self.name} {self.childName}\n
my parent have {self.children} children at once
""")
Dans cet exemple, tu peux utiliser la méthode magique `__str__` pour fournir une représentation
lisible et utile d'un objet lorsque tu veux afficher des informations sur lui directement (par exemple, en
utilisant `print(objet)` ou `str(objet)`).
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 20/27
Actuellement, tes méthodes comme `ParentName` et `ParentChildren` utilisent explicitement `print()`
pour afficher des informations. Si tu utilises `__str__`, tu pourras directement afficher des détails sur
une instance en une seule ligne.
Voici comment tu peux redéfinir `__str__` pour la classe `Parent` et fournir une représentation claire de
ses instances :
python
class Parent:
def __init__(self, name, children):
self.name = name
self.children = children
def ParentName(self):
return print(f"Hello, I'm a parent, my name is {self.name}")
def ParentChildren(self):
return print(f"I have {self.children} children")
def __str__(self):
return f"Parent Name: {self.name}, Children: {self.children}"
Tu peux également redéfinir `__str__` dans `FirstChild` pour fournir une représentation personnalisée
de cette classe enfant :
python
class FirstChild(Parent):
def __init__(self, name, childName, children):
super().__init__(name, children)
self.childName = childName
def DisplayChild(self):
super().ParentName()
super().ParentChildren()
return print(
f"""
Hello friend, my full name is {self.name} {self.childName}\n
My parent has {self.children} children at once
"""
)
def __str__(self):
return f"Child Full Name: {self.name} {self.childName}, Parent: {self.name}, Sibling
s: {self.children - 1}"
Grâce à `__str__`, tu peux facilement obtenir une description de tes objets en utilisant simplement
`print()` :
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 21/27
python
# Création de l'objet
children = FirstChild("Amian", "Anciet Junior", 5)
# Utilisation de __str__
print(children) # Appelle automatiquement __str__
# Output :
# Child Full Name: Amian Anciet Junior, Parent: Amian, Siblings: 4
Lisibilité : Plutôt que d'appeler explicitement des méthodes comme `DisplayChild()`, un simple
`print(objet)` peut afficher des informations importantes.
Réutilisabilité : Avec `__str__`, tu peux facilement intégrer l'affichage d'objets dans des logs, des
rapports, ou d'autres parties de ton code sans devoir écrire une méthode dédiée pour chaque cas.
Gain de temps : Plus besoin d'écrire des `print` ou des méthodes comme `ParentName` pour des
représentations de base.
En conclusion, `__str__` offre un moyen standardisé et élégant de représenter tes objets sous forme de
texte.🎉
dire moi dans cet exemple comment est-ce que je peut appeler mes setitem et mon getitem : class
Point:
def __init__(self):
self.data = {}
def __getitem__(self,key):
return self.data.get(key,'Value not found')
def __setitem__(self,value,name):
return self.data.update({name:value})
def __str__(self):
return f"Data :\n{self.data}"
test = Point()
print(test)
Dans ton exemple, pour appeler les méthodes magiques `__setitem__` et `__getitem__`, tu peux utiliser
la syntaxe d'indexation des dictionnaires directement sur ton objet, comme si c'était un dictionnaire.
Correction et utilisation :
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 22/27
La définition de ta méthode `__setitem__` est incorrecte. Le premier paramètre après `self` doit être la
clé (comme pour les dictionnaires) et le second doit être la valeur. Voici la version corrigée :
python
class Point:
def __init__(self):
self.data = {}
def __str__(self):
# Représentation lisible de l'objet
return f"Data :\n{self.data}"
python
test = Point()
# Utilisation de __setitem__
test['x'] = 10 # Ajoute 'x' avec la valeur 10
test['y'] = 20 # Ajoute 'y' avec la valeur 20
# Utilisation de __getitem__
print(test['x']) # Output : 10
print(test['z']) # Output : Value not found (si la clé n'existe pas)
Explication :
1. `__setitem__(key, value)`
Appelé automatiquement lorsque tu utilises la syntaxe `obj[key] = value`.
Dans cet exemple, `test['x'] = 10` appelle `__setitem__` avec `key='x'` et `value=10`.
2. `__getitem__(key)`
Appelé automatiquement lorsque tu utilises la syntaxe `obj[key]` pour accéder à une valeur.
Par exemple, `test['x']` appelle `__getitem__` avec `key='x'`.
3. `__str__`
Appelé lorsque tu utilises `print(obj)` ou `str(obj)` pour afficher une représentation lisible
de l'objet.
Test complet :
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 23/27
python
test = Point()
regarde l'erreur :
return self.data[name] = value
^
SyntaxError: invalid syntax
python
En Python, tu ne peux pas utiliser une affectation (`=`) comme une expression directement dans un
`return`. L'affectation n'est pas une valeur qui peut être retournée.
Correction
La méthode `__setitem__` doit simplement faire l'affectation sans utiliser `return`. Voici la version
corrigée :
python
class Point:
def __init__(self):
self.data = {}
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 24/27
def __str__(self):
# Représentation lisible de l'objet
return f"Data :\n{self.data}"
python
test = Point()
Explication
1. `self.data[key] = value`
Associe la valeur `value` à la clé `key` dans le dictionnaire.
L'affectation ne retourne pas de valeur, donc il n'y a pas besoin de `return`.
2. Pourquoi pas de `return` dans `__setitem__` ?
Cette méthode est appelée pour effectuer une opération (ajout ou mise à jour d'une clé), pas
pour retourner une valeur.
mais pourquoi valeur no found est-ce afficher même lorsque la clé existe ?
python
La méthode `get` retourne `'Value not found'` si la clé n'existe pas dans le dictionnaire, mais elle
devrait retourner la valeur associée à la clé si elle existe.
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 25/27
Si `'Value not found'` est affiché même lorsque la clé existe, cela signifie probablement que la clé que
tu utilises dans `__getitem__` est différente de celle ajoutée avec `__setitem__`. Cela peut arriver à cause
de :
1. Une incohérence dans les clés (par exemple, utilisation d'espaces ou de mauvais types comme des
entiers au lieu de chaînes).
2. Une erreur dans l'appel de la méthode.
Correction à vérifier :
python
class Point:
def __init__(self):
self.data = {}
def __str__(self):
return f"Data :\n{self.data}"
Test corrigé :
python
test = Point()
# Ajout de valeurs
test['x'] = 10 # Ajoute la clé 'x'
test['y'] = 20 # Ajoute la clé 'y'
Si le problème persiste :
Vérifie que la clé passée dans `__getitem__` est exactement identique à celle ajoutée avec
`__setitem__` (pas d'espaces supplémentaires, différences entre majuscules/minuscules, ou autres
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 26/27
incohérences).
Exemple d'erreurs possibles :
python
Bonne pratique : Lever une exception au lieu d'un message par défaut
Si tu veux un comportement plus strict (et Pythonique), tu peux lever une exception lorsque la clé n'est
pas trouvée :
python
Dans ce cas, si tu essaies d'accéder à une clé inexistante, Python déclenchera une erreur claire avec le
message associé. 😊
Printed using Save ChatGPT as PDF, powered by PDFCrowd HTML to PDF API. 27/27