Класс для минимизации взаимодействия с базой данных? - PullRequest
0 голосов
/ 25 февраля 2019

Я делаю проект Data Science на Python, в котором многие функции и объекты были преобразованы в классы.Одним из этих классов является Universe(), который содержит все имена и атрибуты в нашей базе данных.Как вы можете себе представить, он огромен (занимает более 5 минут) и импортируется как минимум в два других класса (таким образом, значительно замедляя работу других классов).

Я бы хотел сделать так, чтобы в работающем ядре этот класс создавался только один раз, даже если он импортирован из других классов (таким образом, минимизируется взаимодействие с БД).Я думал об использовании static классов, но из того, что я читал, разработчики Python совершенно ненавидят статические классы и считают их непитоническими.

Есть ли другие более питонские решения этой проблемы?Как бы вы определили класс, который инкапсулирует данные и минимизирует взаимодействие с БД для всех других классов, которые его используют?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете создать и создать экземпляр класса в своем собственном модуле на уровне модуля.Этот модуль будет импортирован только один раз, и, следовательно, класс будет создан только один раз.

Пример:

file: uni.py:

class _Universe:
    def __init__(self):
        print('init')
        self.get_database_info()

    def get_database_info(self):
        print('db info')


Universe = _Universe()

file: unia.py:

import unib
from uni import Universe

file: unib.py:

from uni import Universe

Исполняемый файл unia.py предполагает, что класс Universe импортируется дважды, но с учетом вывода (из печатифункции), вы увидите, что это происходит один раз: Python достаточно умен, чтобы повторно использовать уже импортированный модуль:

python unia.py:

output:

init
db info

Обратите внимание, что я использую _Universe, поэтому экземпляр класса можно назвать Universe, чтобы упростить изменения кода

Если у вас есть код, в котором создается экземпляр Universe() (за пределами *Модуль 1033 *), вы можете немного обмануть и добавить метод __call__() к _Universe.Хотя было бы лучше и понятнее переписать эти маленькие кусочки кода, например, с universe = Universe() до Universe:

class _Universe:
    def __init__(self):
        print('init')
        self.get_database_info()

    def get_database_info(self):
        print('db info')

    def __call__(self):
        return self

, а теперь, например, unia.py, вы можете получить:

import unib
from uni import Universe

universe = Universe()

без последствий.
Поскольку это, однако, может привести к путанице (зачем «создавать экземпляр» экземпляра?), Лучше этого не делать.Возможно только для первоначального быстрого теста и выбора времени результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...