Ich habe ein Objekt mit einer internen Datenbankverbindung, die während ihrer gesamten Lebensdauer aktiv ist. Am Ende des Programmlaufs muss die Verbindung festgeschrieben und geschlossen werden. Bisher habe ich eine explizite close
Methode verwendet, aber das ist etwas umständlich, vor allem, wenn Ausnahmen im aufrufenden Code passieren können.Bereinigen einer internen Pysqlite-Verbindung bei Objektzerstörung
Ich erwäge die Verwendung der __del__
Methode zum Schließen, aber nach einigem Lesen online habe ich Bedenken. Ist das ein gültiges Nutzungsmuster? Kann ich sicher sein, dass die internen Ressourcen in __del__
korrekt freigegeben werden?
This discussion ausgelöst eine ähnliche Frage, aber keine befriedigende Antwort gefunden. Ich möchte keine explizite close
Methode haben, und die Verwendung von with
ist keine Option, weil mein Objekt nicht so einfach wie Open-Play-Close verwendet wird, sondern als Mitglied eines anderen, größeren Objekts, das gehalten wird verwendet es beim Ausführen in einer GUI.
C++ hat perfekt funktionierende Destruktoren, wo man Ressourcen sicher freisetzen kann, also würde ich mir vorstellen, dass Python auch etwas vereinbart hat. Aus irgendeinem Grund scheint es nicht der Fall zu sein, und viele in der Gemeinde schwören gegen __del__
. Was ist dann die Alternative?
Ist diese Art von Unordentlichkeit in einer "undichten Abstraktion" Weise für das Objekt nicht, das solch eine Verbindung verwendet? Warum kann ich nicht einfach einen Destruktor wie in C++ verwenden? –
@eliben: es kann. Destructors gehen jedoch nicht gut mit Garbage Collectors und Zirkelverweisen (Sie müssen den Zirkelverweis selbst entfernen, bevor der Destruktor aufgerufen wird) und die Verbindung in Ihrer Anwendung scheint wie eine einzelne Instanz (Singleton), die ein Modul global bietet. Wenn das nicht der Fall ist (Sie benötigen mehrere Verbindungen), können Sie einen Destruktor verwenden. Behalte einfach keine zirkulären Referenzen bei, sonst musst du sie selbst brechen. – nosklo
re C++ Destruktoren, nicht genau. Bei Codierung mit korrekter RAII würde der Zeiger auf die Ressource als ein intelligenter Zeiger (vielleicht als Referenz gezählt) gehalten werden, der selbst freigegeben wird, wenn die Zählung auf eine garantierte Weise 0 erreicht. Dies erfordert jedoch zusätzliche Maschinen (den Smart Pointer) sowie –