Maison  >  Article  >  développement back-end  >  Ma classe Python définit la méthode __del__, mais elle n'est pas appelée lorsque je supprime l'objet

Ma classe Python définit la méthode __del__, mais elle n'est pas appelée lorsque je supprime l'objet

WBOY
WBOYavant
2023-09-24 23:21:051219parcourir

Ma classe Python définit la méthode __del__, mais elle nest pas appelée lorsque je supprime lobjet

__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__().

Exemple

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;

Sortie

We are creating an object.
We are deleting an object.

Raison

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 -

    L'instruction
  • 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.

  • La méthode
  • __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.

Résoudre le problème

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer