单例仅包含字典,静态可访问

时间:2019-05-17 05:44:55

标签: python-3.x singleton

我想提供一个包含字典的类,该类应该在我的整个包中都可以访问。此类应由另一个类(即数据库连接器)初始化。

我从数据库中检索映射,但是我只想在数据库连接器初始化时执行一次。此外,此映射应该可以应用于我的包中的所有其他模块,而无需通过所有函数调用传递数据库连接器的实例。

我考虑过使用Singleton模式,并尝试了this SO post中的一些东西。但是我找不到可行的解决方案。

我用元类这样尝试过:

映射类:

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实例访问映射。 但是在其他我没有此实例的脚本中,我想通过这样的静态/类方法访问映射:

CFMapping.get_cf_by_name("someName")
# leads to AttributeError as CFMapping has no attribute _cf_mapping

是否有一种方法可以使此构造按我想要的方式工作,或者有更好的方法来解决此类问题?

0 个答案:

没有答案