Краткий ответ: Нет.
Длинный ответ: использовать __del__
сложно, главным образом потому, что не гарантируется, что он будет вызван. Это означает, что вы не можете делать там вещи, которые абсолютно необходимо сделать. Это, в свою очередь, означает, что __del__
в основном может использоваться только для очистки, которая рано или поздно произойдет, например, для очистки ресурсов, которые будут очищены при выходе из процесса, поэтому не имеет значения, если __del__
не позвонить. Конечно, это в целом то же самое, что Python сделает для вас. Так что это делает __del__
бесполезным.
Кроме того, __del__
вызывается, когда Python собирает мусор, и вы не хотите ждать сборки мусора Pythons, а это значит, что вы не можете использовать __del__
в любом случае.
Итак, не используйте __del__
. Вместо этого используйте __enter__/__exit__
.
К вашему сведению: Вот пример некруглой ситуации, когда деструктор не вызывался:
class A(object):
def __init__(self):
print('Constructing A')
def __del__(self):
print('Destructing A')
class B(object):
a = A()
ОК, так что это атрибут класса. Очевидно, это особый случай. Но это говорит о том, что вызов __del__
не так прост. Я почти уверен, что видел больше некруглых ситуаций, когда __del__
не вызывается.