Python 多重DAL设计模式
我对python比较陌生。我正在构建一个系统,最初将从数据库中获取数据,但在将来的某个时候,我们将从服务中获取数据。为此,我创建了一个名为BaseDAL的抽象基类,它定义了我的数据获取程序:Python 多重DAL设计模式,python,design-patterns,Python,Design Patterns,我对python比较陌生。我正在构建一个系统,最初将从数据库中获取数据,但在将来的某个时候,我们将从服务中获取数据。为此,我创建了一个名为BaseDAL的抽象基类,它定义了我的数据获取程序: class BaseDAL(object): __metaclass__ = ABCMeta @abstractmethod def get_securities(self): pass @abstractmethod def get_securi
class BaseDAL(object):
__metaclass__ = ABCMeta
@abstractmethod
def get_securities(self):
pass
@abstractmethod
def get_security_data(self, ticker):
pass
这里的想法是,最初的具体实现将从数据库中获取数据,但当服务准备就绪时,我将简单地创建另一个从该服务获取数据的具体实现
这是针对此类问题的正确设计/解决方案吗
第二,基于从配置文件读取的类名,有条件地实例化具体提供程序的好方法是什么。
我想象这样的情况..但是需要帮助我如何从字符串名称实例化实例:
class DALFactory(object):
"""reads a config file, creates a concrete provider, and always return that instance"""
__provider = None
def __init__(self):
pass
@classmethod
def get_provider(cls):
if cls.__provider is None:
cls.__provider = get_provide_type_from_config()
return cls.__provider
看起来你是个Java程序员。在Python中,设计模式、抽象方法和复杂的继承层次结构实际上是未知的:由于duck类型,没有令人信服的理由让您的其他
DAL*
类继承自BaseDAL
——具有适当命名方法的兄弟类同样可以完成这项工作,而且不会太繁琐
getter和setter基本上也是未使用的:只需访问所需的实际属性即可。如果以后需要将其重构为方法,可以对该方法使用@property
,无需任何更改
编辑:如果DBDal
和WSDal
是您的两个类,您可以这样创建一个简单的“工厂”(利用第一类函数):
@mike01010与继承层次结构无关。“兄弟姐妹”互相尊重,而不是“父母和孩子”。好的,明白了。所以基本上创建一个用于访问数据库的DBDal和一个用于访问Web服务的WSDal。现在,工厂模式是否仍然适用于python世界?换句话说,我仍然想让配置驱动使用哪个DAL…@mike01010查看我的编辑。(这不是比Java好很多吗?)
def make_dal(name):
return {
'DBDal identifier string': DBDal,
'WSDal identifier string': WSDal
}[name]()