我对python比较陌生。我正在构建一个最初从数据库中获取数据的系统,但在将来的某个时候,我们将从服务中获取数据。为了解释这个问题,我创建了一个名为BaseDAL的抽象基类,它定义了我的数据获取器:
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
答案 0 :(得分:1)
看起来你是一名Java程序员。设计模式,抽象方法和复杂的继承层次结构在Python中几乎是未知的:因为鸭子类型,没有令人信服的理由让你的其他DAL*
类继承BaseDAL
- 兄弟类适当地 - 命名方法也可以完成工作,而且冗长程度较低。
Getters和setter也基本上没用:只需访问你想要的实际属性。如果您以后需要将其重构为方法,则可以在方法上使用@property
,无需更改任何内容。
Simple is better than complex.
编辑:如果DBDal
和WSDal
是您的两个班级,那么您可以创建一个简单的"工厂"像这样(利用第一类功能):
def make_dal(name):
return {
'DBDal identifier string': DBDal,
'WSDal identifier string': WSDal
}[name]()