Ich bin ein wenig verwirrt, was mit Objekten passiert, wenn der Python-Interpreter herunterfährt. Wenn ich so einen kleinen Code schreibe
%Vor%und es ausführen, ich werde das
bekommen %Vor% Nach meinem Verständnis werden alle Verweise auf erstellte Objekte gelöscht, wenn der Interpreter herunterfährt, und diese Objekte werden __del__()
ausführen, wenn sie angegeben sind (weil ref ref für sie 0 ist).
Meine Verwirrung ist, weil:
__del__()
Ich sehe das It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
Und es wird ein bisschen komplizierter, sagen sie, dass es wegen einiger Zyklusabhängigkeiten nicht garantiert ausgeführt wird, oder es ist einfach nicht garantiert? Wer entscheidet das? Meine Fragen sind also:
__del__
aufgerufen hat guaranteed
ist, wenn ich keine Referenzzyklen habe Ich sehe den Punkt der ersten Frage nicht, aber für CPython 2.7.8 wird __del__
von PyInstanceObject.instance_dealloc
aufgerufen, das als tp_dealloc
registriert ist, das aufgerufen wird, wenn Py_DECREF
aufgerufen wird und die Referenzzählung erreicht Null. Sagen wir also, der Interpreter nennt es, nicht Python-Code. Wenn Sie diese Frage mit der Hoffnung stellen, dass Sie ändern können, wie oder wann es aufgerufen wird, glaube ich nicht, dass es möglich ist.
Warum dies nicht garantiert ist, müssen Sie alle Module durchlaufen, die ihre Variablen vor dem Beenden löschen. Wenn sich die __del__
-Methoden jedoch auf globale Variablen verlassen, gibt es keine einfache Möglichkeit, eine sichere Reihenfolge zu garantieren damit sie ausgeführt werden. Ich sage nicht, dass es unmöglich ist, wie bei Referenzzyklen, ich sage es ist kompliziert.
Ich stelle mir vor, dass dies irgendwann diskutiert wurde, aber die Gemeinde oder der BDFL entschieden, dass es sich nicht lohnt. Ich glaube, ich habe vor Jahren eine Diskussion darüber gesehen, aber ich konnte sie jetzt nicht finden. Die Verwendung der __del__
-Methode wurde von vornherein nicht empfohlen, und wenn Sie sicherstellen müssen, dass eine Destruktor-Methode aufgerufen wird, verwenden Sie möglicherweise besser Kontext-Manager.
Tags und Links python