У меня есть объект с внутренним подключением к базе данных, который активен на протяжении всего срока его службы. В конце запуска программы соединение должно быть завершено и закрыто. До сих пор я использовал явный метод close
, но это несколько громоздко, особенно если в вызывающем коде могут быть исключения.Очистка внутреннего соединения pysqlite при уничтожении объекта
Я рассматриваю возможность использования метода __del__
для закрытия, но после некоторого чтения онлайн у меня есть проблемы. Является ли это допустимым шаблоном использования? Могу ли я быть уверенным, что внутренние ресурсы будут освобождены в __del__
правильно?
This discussion поставил аналогичный вопрос, но не нашел удовлетворительного ответа. Я не хочу иметь явный метод close
, и использование with
не является опцией, потому что мой объект не используется так же просто, как open-play-close, но сохраняется как член другого более крупного объекта, который использует его во время работы в графическом интерфейсе.
C++ имеет совершенно рабочие деструкторы, где можно безопасно освобождать ресурсы, поэтому я бы предположил, что у Python есть что-то согласованное. По какой-то причине это, похоже, не так, и многие в сообществе обет против __del__
. Тогда какая альтернатива?
Разве это не так-то неясно, как «непротекающая абстракция» для объекта, использующего такое соединение? Почему я не могу использовать деструктор, как в C++? –
@eliben: можно. Однако деструкторы не справляются с сборщиками мусора и круговыми ссылками (вы должны удалить кольцевую ссылку самостоятельно до вызова деструктора), а соединение в вашем приложении похоже на один экземпляр (singleton), который обеспечивает глобальный модуль. Если это не так (вам нужно несколько соединений), вы можете пойти деструктором. Просто не держите круговые ссылки, или вам придется их самостоятельно разбить. – nosklo
деструкторов re C++, не совсем. Кодирование с правильным RAII, указатель на ресурс будет храниться в виде умного указателя (возможно, подсчета ссылок), который освобождается сам, когда счетчик достигает 0 в гарантированном порядке. Однако для этого требуется дополнительное оборудование (умный указатель) –