Синглтон, содержащий только слова, статически доступный - PullRequest
0 голосов
/ 17 мая 2019

Я хочу предоставить класс, содержащий словарь, который должен быть доступен по всему моему пакету. Этот класс должен быть инициализирован другим классом, который является соединителем базы данных.

Из базы данных я получаю сопоставление, но хочу сделать это только один раз при инициализации коннектора базы данных. Кроме того, это сопоставление должно быть доступно для всех других модулей в моем пакете без передачи экземпляра соединителя базы данных через все вызовы функций.

Я думал об использовании шаблона 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

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

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