Python-Objekte ordnungsgemäß bereinigen
Die Methode __del__() wird häufig zum Bereinigen von Ressourcen verwendet, wenn ein Python-Objekt zerstört wird. Das Verlassen auf __del__() kann jedoch aufgrund des Garbage-Collection-Systems von Python problematisch sein, das die Existenz von „globalen Variablen“ während des __del__()-Aufrufs nicht garantiert.
Um eine ordnungsgemäße Objektbereinigung sicherzustellen, wird dies empfohlen Verwenden Sie die with-Anweisung von Python. Die with-Anweisung verwendet eine Klasseninstanz als Argument und garantiert, dass die Methode __enter__() der Klasse beim Eintritt und ihre Methode __exit__() beim Verlassen aufgerufen wird, unabhängig von Ausnahmen.
Betrachten Sie die folgende Paketklasse:
<code class="python">class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file)</code>
Die Methode __del__() versucht, alle zum Paket gehörenden Dateien zu entfernen. Allerdings kann es aufgrund fehlender Verweise auf self.files fehlschlagen. Um dieses Problem zu beheben, definieren Sie die Methoden __enter__() und __exit__() wie folgt:
<code class="python">class Package: def __init__(self): self.files = [] def __enter__(self): return self # ... def __exit__(self, exc_type, exc_value, traceback): for file in self.files: os.unlink(file)</code>
Wenn Sie nun die Package-Klasse mit einer with-Anweisung verwenden:
<code class="python">with Package() as package_obj: # use package_obj</code>
__enter__() ist wird beim Eintritt aufgerufen und __exit__() wird garantiert beim Beenden aufgerufen, wodurch eine ordnungsgemäße Dateibereinigung auch bei Ausnahmen gewährleistet wird.
Um eine versehentliche direkte Instanziierung der Package-Klasse ohne Verwendung der with-Anweisung zu verhindern, sollten Sie die Erstellung einer PackageResource-Klasse mit den Methoden __enter__() und __exit__():
<code class="python">class PackageResource: def __enter__(self): class Package: ... self.package_obj = Package() return self.package_obj def __exit__(self, exc_type, exc_value, traceback): self.package_obj.cleanup()</code>
Mit diesem Ansatz kann die Package-Klasse nur innerhalb einer with-Anweisung instanziiert werden:
<code class="python">with PackageResource() as package_obj: # use package_obj</code>
Das obige ist der detaillierte Inhalt vonSo stellen Sie eine ordnungsgemäße Objektbereinigung in Python sicher: Reicht „__del__()' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!