Aller au contenu
M03 · A. Appréhender le paradigme de la POO

Créer un objet : instanciation et références

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
VARIABLES MÉMOIRE (OBJETS) compte1 compte2 compte3 #1 Comptetitulaire = "Ali" solde = 300 #2 Comptetitulaire = "Ali" solde = 300 compte1 is compte2 → Truecompte1 is compte3 → False

À 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.

TestSignification
a is bmême objet en mémoire
a == bmê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 = 0
print(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épendant
print(a is b)      # False

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.
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console
Mémoire : objets créés

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é
class Compte:
    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'objet
del d        # compte fermé : Ali

5Vérifier

1. Que fait l'instruction b = a si a contient un objet ?
2. Quel opérateur teste si deux variables désignent le même objet ?
3. Que fait del c en Python ?