Die __del__-Methode implementieren und testen
In diesem Schritt lernen Sie die Methode __del__ kennen. Diese Methode wird als Finalizer oder Destruktor bezeichnet. Sie wird aufgerufen, wenn die Referenzanzahl eines Objekts auf null sinkt, was bedeutet, dass es kurz davorsteht, vom Garbage Collector von Python zerstört zu werden. Sie wird häufig für Aufräumarbeiten verwendet, wie das Schließen von Netzwerkverbindungen oder Dateihandles.
Sie können eine Referenz auf ein Objekt mithilfe der del-Anweisung entfernen. Wenn die letzte Referenz verschwunden ist, wird __del__ automatisch aufgerufen.
Fügen wir unserer Dog-Klasse eine __del__-Methode hinzu, um zu sehen, wann ein Objekt zerstört wird.
Öffnen Sie erneut die Datei dog_cat.py. Ersetzen Sie den gesamten Inhalt der Datei durch den folgenden Code. Diese Version entfernt den Code, der eine Dog-Instanz erstellt (um zu vermeiden, dass sie beim Importieren des Moduls erstellt wird), und fügt der Dog-Klasse die Methode __del__ hinzu.
## 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...')
## Fügen Sie diese Methode zur Dog-Klasse hinzu
def __del__(self):
print(f'The Dog object {self._name} is being deleted.')
Speichern Sie die Datei dog_cat.py.
Erstellen wir nun ein separates Skript, um dieses Verhalten zu testen. Öffnen Sie die Datei test_del.py im Dateiexplorer.
Fügen Sie den folgenden Code in test_del.py ein. Dieses Skript erstellt zwei Dog-Instanzen und löscht dann eine davon explizit.
## 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.")
## Der Garbage Collector wird möglicherweise nicht sofort ausgeführt.
## Wir fügen eine kleine Verzögerung hinzu, um ihm Zeit zur Ausführung zu geben.
time.sleep(1)
print("\nScript is about to end. d2 will be deleted automatically.")
Speichern Sie die Datei. Führen Sie nun das Skript test_del.py im Terminal aus.
python ~/project/test_del.py
Beobachten Sie die Ausgabe. Die __del__-Meldung für Tom erscheint, nachdem del d1 aufgerufen wurde. Die Meldung für John erscheint ganz am Ende, da das Objekt d2 automatisch vom Garbage Collector bereinigt wird, wenn das Skript endet.
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.
Hinweis: Der genaue Zeitpunkt der Garbage Collection kann variieren. __del__ wird aufgerufen, wenn das Objekt gesammelt wird, nicht unbedingt unmittelbar nachdem del verwendet wurde.