Heim  >  Artikel  >  Backend-Entwicklung  >  Meine Python-Klasse definiert die Methode __del__, sie wird jedoch nicht aufgerufen, wenn ich das Objekt lösche

Meine Python-Klasse definiert die Methode __del__, sie wird jedoch nicht aufgerufen, wenn ich das Objekt lösche

WBOY
WBOYnach vorne
2023-09-24 23:21:051219Durchsuche

Meine Python-Klasse definiert die Methode __del__, sie wird jedoch nicht aufgerufen, wenn ich das Objekt lösche

__del__ ist eine magische Methode in Python. Diese magischen Methoden ermöglichen es uns, einige sehr nette Tricks in der objektorientierten Programmierung umzusetzen. Sie werden auch Dunder-Methoden genannt. Diese Methoden werden durch zwei Unterstriche (__) identifiziert, die als Präfix und Suffix verwendet werden.

In Python erstellen wir ein Objekt mit __new__() und initialisieren es mit __init__(). Um jedoch ein Objekt zu zerstören, haben wir __del__().

Beispiel

Lassen Sie uns ein Objekt erstellen und löschen -

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;

Ausgabe

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

Grund

Wenn jedoch eine Klasse __del__ definiert, diese aber beim Löschen eines Objekts nicht aufgerufen wird, kann das viele Gründe haben -

    Die
  • del-Anweisung ruft nicht unbedingt __del__() auf – sie dekrementiert lediglich den Referenzzähler des Objekts und ruft __del__() auf, wenn er Null erreicht.

  • Die Methode
  • __del__() kann zufällig aufgerufen werden. – Wenn Ihre Datenstruktur zirkuläre Links enthält, wird der Referenzzähler nie wieder auf Null zurückgehen. Python führt einen Algorithmus aus, um solche Zyklen zu erkennen, der Garbage Collector wird jedoch möglicherweise einige Zeit nach dem Verschwinden des letzten Verweises auf die Datenstruktur ausgeführt.

Lösen Sie das Problem

Hier sind die Korrekturen -

  • Rufen Sie __del__() nicht direkt auf – _del__() sollte close() aufrufen und close() sollte sicherstellen, dass es mehrmals für dasselbe Objekt aufgerufen werden kann.

  • Zirkelverweise vermeiden – Verwenden Sie das Weakref-Modul, um Zirkelverweise zu vermeiden. Es ermöglicht Ihnen, auf ein Objekt zu verweisen, ohne dessen Referenzanzahl zu erhöhen. Das Weakref-Modul kann auch verwendet werden, um Instanzen von Klassen abzurufen

Das obige ist der detaillierte Inhalt vonMeine Python-Klasse definiert die Methode __del__, sie wird jedoch nicht aufgerufen, wenn ich das Objekt lösche. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen