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

WBOY
Libérer: 2023-09-24 23:21:05
avant
1240 Les gens l'ont consulté

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;
Copier après la connexion

Sortie

We are creating an object.
We are deleting an object.
Copier après la connexion

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!

source:tutorialspoint.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!