动态选择API以使用

时间:2017-11-30 11:23:43

标签: python python-2.7 oop design-patterns

我在Python代码中使用外部工具。为了初始化这个工具,我必须创建几个对象。有问题的外部工具提供了两个完全不同的API,这些API中没有一个能够创建工具所需的所有对象。假设该工具是交通模拟工具,其中使用API​​ 1创建汽车对象,使用API​​ 2创建自行车。

我玩过继承,试图选择合适的设计模式,但我的所有解决方案看起来都很难看。

表达我想要实现的目标的最简单方法是:

class ObjectHandler():    
    api_1_types = ('type1', 'foo')
    api_2_types = ('type2', 'bar')

    def __init__(self):
        self.handler1 = ObjectHandler1()
        self.handler2 = ObjectHandler2()

    def create(self, obj_type):
        if obj_type in self.api_1_types:
            return self.handler1.create()
        elif obj_type in self.api_2_types:
            return self.handler2.create()
        else:
            raise NotImplementedError

class ObjectHandler1():
    def __init__(self):
        # load external module that defines API 1
    def create(self):
        # return an object created via API 1

class ObjectHandler2():
    def __init__(self):
        # load external module that defines API 2
    def create(self):
        # return an object created via API 2

if __name__ == '__main__':
    handler = ObjectHandler()
    object_1 = handler.create('type1')  # must be created by ObjectHandler1
    object_2 = handler.create('type2')  # must be created by ObjectHandler2

我现在正在寻找一种良好的OO和pythonic方式来实现这一目标。

1 个答案:

答案 0 :(得分:2)

你的方法看起来不错。应该在测试中使用套装,但它并不重要。另一种选择可能如下,但我不知道它是否更好:

def __init__(self):
    self.handlers = dict()

    handler1 = ObjectHandler1()
    for type in api_1_types:
        # These won't be copied but simply be a reference to the object
        self.handlers[type] = handler1
    # Repeat for the other one

def create(self, obj_type):
    try:
        return self.handlers[obj_type].create()
    except KeyError:
        raise NotImplementedError