Вы можете создать и создать экземпляр класса в своем собственном модуле на уровне модуля.Этот модуль будет импортирован только один раз, и, следовательно, класс будет создан только один раз.
Пример:
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()
без последствий.
Поскольку это, однако, может привести к путанице (зачем «создавать экземпляр» экземпляра?), Лучше этого не делать.Возможно только для первоначального быстрого теста и выбора времени результатов.