Как создать метод класса, который будет самостоятельно вызываться при завершении программы

В созданном классе, необходимо создать аналог блока finally, который будет выполнять некоторые команды (spi.close() и GPIO.cleanup()) в конце работы программы, вне зависимости по какой причине программа завершилась (ошибка или нормальное завершение программы). Можно ли осуществить такой функционал в теле класса?


Ответы (1 шт):

Автор решения: insolor
  1. Можно зарегистрировать метод с помощью модуля atexit:
import atexit


class Someclass:
    def __init__(self):
        ...
        atexit.register(self.at_exit)
    
    def at_exit(self):
        spi.close()
        GPIO.cleanup()
  1. Можно создать менеджер контекста, который при входе в блок with будет делать какую-то подготовку, при выходе - всякую очистку (вынести подготовку/завершение из класса):
import contextlib


@contextlib.contextmanager
def prepare_interfaces():
    ...  # Тут вставить подготовку GPIO и SPI, если она требуется
    try:
        yield  # Передаем управление внутрь блока with
    finally:
        # При ошибке или корректном выходе из блока with "деинициализируем" интерфейсы
        spi.close()
        GPIO.cleanup()


with prepare_interfaces():
    do_something()

См. contextlib.contextmanager

Также как вариант можно сам класс сделать менеджером контекста, для этого нужно реализовать методы __enter__ (то что должно выполниться до входа в блок with) и __exit__ (то что выполнится при выходе из блока).

→ Ссылка