Maison >développement back-end >Tutoriel Python >Ma classe Python définit la méthode __del__, mais elle n'est pas appelée lorsque je supprime l'objet
__del__ est une méthode magique en Python. Ces méthodes magiques nous permettent d’implémenter des astuces très intéressantes en programmation orientée objet. Elles sont également appelées méthodes Dunder. Ces méthodes sont identifiées par deux traits de soulignement (__) utilisés comme préfixe et suffixe.
En Python, nous créons un objet en utilisant __new__() et l'initialisons en utilisant __init__(). Cependant, pour détruire un objet, nous avons __del__().
Créons et supprimons un objet -
class Demo: def __init__(self): print("We are creating an object."); # destructor def __del__(self): print("We are deleting an object."); # Createing and deleting an object ob = Demo(); del ob;
We are creating an object. We are deleting an object.
Cependant, si une classe définit __del__ mais qu'elle n'est pas appelée lors de la suppression d'un objet, il peut y avoir plusieurs raisons -
del n'appelle pas nécessairement __del__() - elle décrémente simplement le nombre de références de l'objet et appelle __del__() s'il atteint zéro.
__del__() peut être appelée de manière aléatoire. - Si votre structure de données contient des liens circulaires, le nombre de références ne reviendra jamais à zéro. Python exécute un algorithme pour détecter de tels cycles, mais le garbage collector peut s'exécuter quelque temps après la disparition de la dernière référence à la structure de données.
Voici les correctifs -
N'appelez pas __del__() directement - _del__() devrait appeler close(), et close() devrait garantir qu'il peut être appelé plusieurs fois sur le même objet.
Éviter les références circulaires - Utilisez le module lowref pour éviter les références circulaires. Il vous permet de pointer vers un objet sans augmenter son nombre de références. Le module Weakref peut également être utilisé pour obtenir des instances de classes
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!