我正在用Flask为Python中间件实现一个可插拔存储系统
我想做的是启动我的程序,让它创建一个数据库。 该数据库可以是CouchDB、本地文件系统等。它被称为“配置存储” 程序的其余部分应该可以访问此数据库
目前看起来是这样的:
我有一个带有init.py的/api文件夹,在这个文件的开头有
...
configuration_store = ConfigurationStoreFactory.create("CouchDB")
config = Config()
...
例如,Config类应该能够访问配置存储的唯一实例。例如,它应该能够执行类似store.getstoreurl()的操作
在/configuration\u store文件夹中,我有4个文件:\u init\u py、configuration\u store\u factory.py、couchDB\u store.py和local\u file\u system\u store.py
在init.py中,我有:
from simplekv import KeyValueStore
from abc import ABCMeta, abstractmethod, abstractproperty
class ConfigurationStore(type, KeyValueStore):
__metaclass__ = ABCMeta
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(ConfigurationStore, cls).__call__(*args, **kwargs)
return cls._instances[cls]
@abstractmethod
def getConfigurationStoreTenantUrl(self, database):
pass
@abstractproperty
def configuration_store_url(self):
pass
在我的工厂里我有
class ConfigurationStoreFactory():
def __init__(self, logger_name):
self.logger = Logger(logger_name)
@staticmethod
def create(type):
if type == "CouchDB":
from couchDB_store import CouchDBStore
store = CouchDBStore()
elif type == "LFS" or type == "LocalFileSystemStore":
from local_file_system_store import LocalFileSystemStore
store = LocalFileSystemStore('./data')
else: #assume LFS
from simplekv.fs import FilesystemStore
store = FilesystemStore('./data')
return store
在CouchDB_store.py我有
from configuration_store import ConfigurationStore
class CouchDBStore(ConfigurationStore):
configuration_store_url = None
#Instantiate this later since we need access to the config to get it correct
def __init__(self):
super(CouchDBStore,self).__init__('CouchDBStore')
self.configuration_store_url = "https://"+ self.manager.config.getConfigKey("couchDbAdmin")+":" +self.config.getConfigKey("couchDbPassword")+"@" \
+ self.config.getConfigKey("couchDbHostHttp") + ":"+ self.config.getConfigKey("couchDbPort")+"/"
这是行不通的:我收到了关于“抽象类'CouchDBStore'和抽象方法实例化”的投诉。 我也有一种困惑的感觉,这不是一个好方法
困难在于,我希望继承Python包simplekv,但也希望将其子类化为我自己的数据库类型,并将整个包作为一个单例提供,以便只创建一个数据库,并且程序的其余部分可以访问它
有什么好办法来解决这个问题? 我正在考虑放弃工厂,只在init.py中初始化一次,然后确定那里的数据库类型。但我不确定
目前没有回答
相关问题 更多 >
编程相关推荐