Я создал свой собственный модуль для управления объектами в базе данных. Чтобы ограничить соединения с базой данных, я создаю выделенный класс одним способом.Управление соединением базы данных с синглонами Python
Construstor вызывается, как ожидалось, но деструктор никогда не вызывается, поэтому соединение с базой данных никогда не будет близко.
class DBConnection:
instance = None
con = None
def __new__(cls):
if DBConnection.instance is None:
DBConnection.instance = object.__new__(cls)
return DBConnection.instance
def __init__(self):
if DBConnection.con is None:
try:
DBConnection.con = psycopg2.connect(database='...', user='...', password='...')
print('Database connection opened.')
except psycopg2.DatabaseError as db_error:
print("Erreur :\n{0}".format(db_error))
def __del__(self):
if DBConnection.con is not None:
DBConnection.close()
print('Database connection closed.')
Первоначальный экземпляр, напечатанный «Соединение с базой данных открылось». как и ожидалось. Второй экземпляр напечатал ничего, как ожидалось. Первый экземпляр удалил как можно скорее. Второй экземпляр удалил ничего, но ожидалось, что сообщение «Соединение с базой данных закрыто».
Я легко понимаю причину: ссылка все еще существует, но я не знаю почему. Как удалить все ссылки, чтобы закрыть соединение с базой данных?
С уважением, Serge
Спасибо @lanzz за ваш ответ. По вашему мнению, как я могу хранить weakref для моего экземпляра класса? Единственный способ, который я вижу, - создать первый экземпляр, а затем создать weakref для первого, но я все еще не могу закрыть соединение с базой данных ... – srjjio
Я мог бы помочь вам, если вы разместите свои попытки использовать 'weakref'. В документах модулей представлено множество примеров использования 'weakref'. Я не могу догадаться, почему ваш экземпляр еще не выпущен без просмотра вашего измененного кода. – lanzz