动态选择使用API

2024-10-03 09:11:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python代码中使用了一个外部工具。为了初始化这个工具,我必须创建几个对象。所讨论的外部工具提供了两个完全不同的api,这些api中没有一个能够创建工具所需的所有对象。比如说,这个工具是trafic simulation tool,其中汽车对象是使用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方法来实现这一点。你知道吗


Tags: 工具对象selfapireturnobjectinitdef
1条回答
网友
1楼 · 发布于 2024-10-03 09:11:15

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

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

相关问题 更多 >