我想提供一个包含字典的类,该类应该在我的整个包中都可以访问。此类应由另一个类(即数据库连接器)初始化。
我从数据库中检索映射,但是我只想在数据库连接器初始化时执行一次。此外,此映射应该可以应用于我的包中的所有其他模块,而无需通过所有函数调用传递数据库连接器的实例。
我考虑过使用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
是否有一种方法可以使此构造按我想要的方式工作,或者有更好的方法来解决此类问题?