Instancier une classe, comprendre qu'une variable contient une référence vers l'objet et non l'objet lui-même, et savoir comment un objet est détruit.
1Situer
Un stagiaire écrit compte2 = compte1 pour « copier » un compte, puis dépose 100 DH sur compte2. Surprise : compte1 a aussi augmenté de 100 DH. Il n'y a jamais eu deux comptes, seulement deux noms pour le même objet. Comprendre les références évite ce genre de bug, très fréquent.
2Comprendre
Une variable contient une référence vers l'objet
À gauche les variables (les noms), à droite la mémoire où vivent les objets.
1 / 6
Un objet est un exemplaire concret d’une classe. On le crée en appelant la classe comme une fonction : c’est l’instanciation.
compte1 =Compte("Ali", 300)
Trois choses se passent : Python réserve de la mémoire pour un nouvel objet, appelle __init__ pour le remplir, puis range dans compte1 une référence vers cet objet (son adresse).
Une variable contient une référence
La variable n’est pas l’objet : c’est une étiquette collée dessus. Quand on écrit compte2 = compte1, on colle une deuxième étiquette sur le même objet. Modifier l’un, c’est modifier l’autre.
Test
Signification
a is b
même objet en mémoire
a == b
même valeur (si la classe définit __eq__)
id(a)
identifiant unique de l’objet
isinstance(a, Compte)
a est-il une instance de Compte ?
Destruction d’un objet
En Python, on ne détruit pas un objet à la main. On peut supprimer un nom avec del compte1. Quand plus aucun nom ne référence l’objet, le ramasse-miettes libère la mémoire et appelle __del__ s’il existe.
Dans d’autres langages comme C++, on détruit explicitement les objets ; en Java et en Python, c’est automatique.
Exemple simple
Deux surnoms, une seule personne
À la maison on vous appelle « Simo », au centre « Mohamed ». Si Simo se coupe les cheveux, Mohamed aussi : c'est la même personne. Deux variables qui pointent vers le même objet, c'est pareil.
a =Compte(100)
b = a # b est un deuxième nom pour le même objet
b.solde =0print(a.solde) # 0
Exemple simple
La vraie copie
Pour avoir deux objets différents, il faut en créer un deuxième, ou utiliser le module copy.
import copy
b = copy.copy(a) # un nouvel objet, indépendantprint(a is b) # False
Publicité
3Manipuler
Exécutez : dans la mémoire, compte1 et compte2 pointent vers le même objet #1, tandis que compte3 a son propre objet. Remplacez compte2 = compte1 par compte2 = Compte("Ali", 300) et observez la différence.
Exécutez le code : les objets et leurs attributs s'afficheront ici.
4Pratiquer
Exercice 1 · Prédire l'affichage
Sans exécuter, donnez l'affichage du programme suivant, puis vérifiez dans la simulation. p1 = Point(1, 2) ; p2 = p1 ; p2.x = 10 ; p3 = Point(1, 2) ; print(p1.x, p3.x, p1 is p2, p1 is p3)
Voir le corrigé
10 1 True False
p1 et p2 sont le même objet ; p3 est un autre objet.
Exercice 2 · Une liste d'objets
Créez une liste de trois objets Compte en une ligne avec une boucle, puis affichez le titulaire de chacun.
Voir le corrigé
noms = ["Ali", "Sara", "Hind"]
comptes = [Compte(n, 0) for n in noms]
for c in comptes:
print(c.titulaire)
Exercice 3 · Détruire un objet
Ajoutez à Compte un destructeur __del__ qui affiche « compte fermé ». Créez un compte c, puis écrivez del c. Que se passe-t-il si une autre variable référence encore l'objet ?
Voir le corrigé
classCompte:
def__init__(self, titulaire):
self.titulaire = titulaire
def__del__(self):
print("compte fermé :", self.titulaire)
c =Compte("Ali")
d = c
del c # rien ne s'affiche : d référence encore l'objetdel d # compte fermé : Ali