С учётом контекста твоих предыдущих вопросов - ты пытаешься реализовать
мой совет, но получается плохо.
Смотри.
#сначала реализуем механизм, который позволяет получать объект дневник для пользователя
import typing
from functools import lru_cache
# говорим, что результаты вызова функции должны кэшироваться,
# но храниться в кэше должно не более 50 экземпляров класса Dnevnik
# при появлении новых экземпляров, самые старые будут выкинуты
@lru_cache(maxsize=50)
# принимаем ID пользователя Telegram, возвращаем или объект Dnevnik, или None
def get_user_dnevnik(user_id) -> typing.Optional[Dnevnik]:
# получаешь новый курсор для своего соединения с БД
# я фз как у тебя называется глобальная переменная, хранящая соединение,
# так что назвал её db_conn. Поправишь
cursor = db_conn.cursor()
# выбираем из таблицы логинов/паролей пару, соответствующую указанному пользователю
# имена таблицы и столбцов опять таки поправь, я не помню как они у тебя называются
cursor.execute("SELECT loginD, passwordD FROM users WHERE id = ?", (user_id,))
row = cursor.fetchone()
if row is None: # нет такого пользователя, возвращаем None
return None
# в запросе порядок столбцов сначала логин, потом пароль, так что row = (логин, пароль)
return Dnevnik(login=row[0], password=row[1]) # возвращаем объект Dnevnik
Теперь, всякий раз, когда тебе требуется объект Dnevnik для пользователя с известным id, вызываешь функцию
get_user_dnevnik(), передав ей в параметрах этот id.
Поскольку мы указали для функции lru_cache, фактически запрос к БД и конструирование объекта Dnevnik будет выполняться только если в кэше нет дневника для пользователя с этим id. А если он есть, то дневник будет быстренько возвращён из кэша.
В то же время кэш будет расти не беспредельно, его размер мы явно задаём и можем подогнать под свои нужды, чтобы балансировать потребление кэшем памяти и потребление проца повторным созданием экземпляров Dnevnik.