У меня есть некоторый test.py файл:__del__ на поведение выхода
class A:
def __init__(self):
print("A init")
def __del__(self):
print("A del")
a = A()
Когда я запускаю его в 10 раз (python3 test.py
) всегда производит следующий вывод:
A init
A del
Но если добавить sys.exit
вызов до конца сценария:
import sys
class A:
def __init__(self):
print("A init")
def __del__(self):
print("A del")
a = A()
sys.exit(-1)
в 5 из 10 случаев (случайно) у меня есть
A init
и во второй половине случаев:
A init
A del
Я использую Python3.4.3 [MSC v.1600 32 разрядную] на Windows 7 x64. Итак, почему метод __del__
называется не каждый раз? Нужно ли мне использовать какой-либо другой метод выхода для передачи кода возврата сценария и гарантированного выполнения всех деструкторов? И еще один связанный с этим вопрос: можно ли запустить деструкторы при получении SIGTERM или SIGKILL из ОС?
Если вы хотите, чтобы гарантировать метод очистки вызывается, рассмотрим менеджер контекста. – jonrsharpe
Вы почти никогда не должны использовать '__del__'. Вы можете поймать сигналы с помощью модуля 'signal', за исключением SIGKILL, который нельзя поймать. – L3viathan
Кроме того, используйте 'sys.exit (0);', что означает, что код работал правильно. – AMACB