So stellen Sie eine ordnungsgemäße Objektbereinigung in Python sicher: Reicht „__del__()' aus?

Linda Hamilton
Freigeben: 2024-10-27 13:01:01
Original
590 Leute haben es durchsucht

 How to Ensure Proper Object Cleanup in Python: Is `__del__()` Enough?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Wenn Sie nun die Package-Klasse mit einer with-Anweisung verwenden:

<code class="python">with Package() as package_obj:
    # use package_obj</code>
Nach dem Login kopieren

__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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!