我在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方式来实现这一目标。
答案 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