self
правильно привязан внутри обратного вызова do_cleanup, но на самом деле, если все, что вы делаете, это вызывает метод, вы можете также напрямую использовать связанный метод.
Вы используете atexit.unregister()
для удаленияобратный вызов, но здесь есть одна загвоздка: вы должны отменить регистрацию той же функции, которую вы зарегистрировали, и поскольку вы использовали вложенную функцию, это означает, что вы должны хранить ссылку на эту функцию.Если вы последуете моему предложению использовать связанный метод, вам все равно придется сохранить ссылку на него:
class Foo:
def cleanup(self):
# do something here
def start(self):
self._cleanup = self.cleanup # Need to save the bound method for unregister
atexit.register(self._cleanup)
def end(self):
atexit.unregister(self._cleanup)
Обратите внимание, что ваш код по-прежнему может завершиться без вызова atexit
зарегистрированных функций,например, если процесс прерывается с помощью ctrl + break на окнах или уничтожается с помощью SIGABRT в linux.
Также в качестве другого ответа предлагается просто использовать __del__
, но это может быть проблематично для очистки во время выхода из программыпоскольку его нельзя вызывать до тех пор, пока не будут удалены другие глобальные объекты, к которым он должен получить доступ.
Отредактировано, чтобы заметить, что когда я писал этот ответ, в вопросе не был указан Python 2.x.Да ладно, я все равно оставлю здесь ответ, если он кому-нибудь еще поможет.