Implémenter et Tester la Méthode __del__
Dans cette étape, vous allez découvrir la méthode __del__. Cette méthode est appelée un finaliseur ou un destructeur. Elle est invoquée lorsque le compte de références d'un objet tombe à zéro, ce qui signifie qu'il est sur le point d'être détruit par le ramasse-miettes (garbage collector) de Python. Elle est souvent utilisée pour des tâches de nettoyage, comme la fermeture de connexions réseau ou de descripteurs de fichiers (file handles).
Vous pouvez supprimer une référence à un objet en utilisant l'instruction del. Lorsque la dernière référence disparaît, __del__ est automatiquement appelée.
Ajoutons une méthode __del__ à notre classe Dog pour voir quand un objet est détruit.
Ouvrez à nouveau le fichier dog_cat.py. Remplacez l'intégralité du contenu du fichier par le code suivant. Cette version supprime le code qui crée une instance de Dog (pour éviter de la créer lors de l'importation du module), et elle ajoute la méthode __del__ à la classe Dog.
## File Name: dog_cat.py
class Animal:
def __init__(self, name):
self._name = name
def say(self):
print(self._name + ' is saying something')
class Dog(Animal):
def __new__(cls, name, age):
instance = super().__new__(cls)
return instance
def __init__(self, name, age):
super().__init__(name)
self.age = age
def say(self):
print(self._name + ' is making a sound: wang wang wang...')
## Add this method to the Dog class
def __del__(self):
print(f'The Dog object {self._name} is being deleted.')
Enregistrez le fichier dog_cat.py.
Maintenant, créons un script séparé pour tester ce comportement. Ouvrez le fichier test_del.py dans l'explorateur de fichiers.
Ajoutez le code suivant à test_del.py. Ce script créera deux instances de Dog puis en supprimera explicitement une.
## File Name: test_del.py
from dog_cat import Dog
import time
print("Creating two Dog objects: d1 and d2.")
d1 = Dog('Tom', 3)
d2 = Dog('John', 5)
print("\nDeleting reference to d1...")
del d1
print("Reference to d1 deleted.")
## The garbage collector may not run immediately.
## We add a small delay to give it time to run.
time.sleep(1)
print("\nScript is about to end. d2 will be deleted automatically.")
Enregistrez le fichier. Maintenant, exécutez le script test_del.py dans le terminal.
python ~/project/test_del.py
Observez la sortie. Le message __del__ pour Tom apparaît après l'appel de del d1. Le message pour John apparaît à la toute fin, car l'objet d2 est collecté par le ramasse-miettes lorsque le script se termine.
Creating two Dog objects: d1 and d2.
Deleting reference to d1...
The Dog object Tom is being deleted.
Reference to d1 deleted.
Script is about to end. d2 will be deleted automatically.
The Dog object John is being deleted.
Note: Le moment exact de la collecte des déchets peut varier. __del__ est appelée lorsque l'objet est collecté, et pas nécessairement immédiatement après l'utilisation de del.