Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多重DAL设计模式_Python_Design Patterns - Fatal编程技术网

Python 多重DAL设计模式

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

我对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

看起来你是个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]()