Я хочу предоставить класс, содержащий словарь, который должен быть доступен по всему моему пакету. Этот класс должен быть инициализирован другим классом, который является соединителем базы данных.
Из базы данных я получаю сопоставление, но хочу сделать это только один раз при инициализации коннектора базы данных. Кроме того, это сопоставление должно быть доступно для всех других модулей в моем пакете без передачи экземпляра соединителя базы данных через все вызовы функций.
Я думал об использовании шаблона Singleton и пробовал кое-что из этого поста . Но я не могу найти рабочее решение.
Я пробовал это так с метаклассом:
Класс отображения:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class CFMapping(metaclass=Singleton):
def __init__(self, cf_mapping: dict):
self._cf_mapping = cf_mapping
@classmethod
def get_cf_by_name(cls, name: str) -> str:
return cls._cf_mapping.get(name)
Соединитель базы данных
class DBConnector:
def __init__(....):
# some init logic, connection to db etc...
self.cf_mapping = self.get_cf_mapping() # just returning a dict from a rest call
Теперь я ожидаю, что сопоставление будет доступно через экземпляр DBConnector.
Но в других сценариях, где у меня нет этого экземпляра, я хотел бы получить доступ к отображению только через метод static / class, например:
CFMapping.get_cf_by_name("someName")
# leads to AttributeError as CFMapping has no attribute _cf_mapping
Есть ли способ заставить эту конструкцию работать так, как я хочу, или есть какой-то лучший подход для такой проблемы?