所以我有很多函数,每个函数都对服务进行api调用,进行一些处理并返回一些东西。然而,这些服务中有几个是相似的,我基本上需要为每个服务创建具有所有相同功能的类,但根据环境变量的值,在运行时只会使用其中一个类。
在python中,最好的方法是什么?
我可以使用ABC创建一个抽象基类,确保所有这些类实现相同的函数。
AbstractThing(ABC):
@abstractmethod
def action1(self):
pass
@abstractmethod
def action2(self):
pass
Thing1(AbstractThing):
def action1(self):
# do something
return something
def action2(self):
# do something
return something
Thing2(AbstractThing):
def action1(self):
# do something
return something
def action2(self):
# do something
return something
然而,我正在努力解决的是如何在python代码的其余部分中获得该类。
我是否应该创建另一个类,它具有所有这些相同的函数,但得到了这些子类中正确的一个,并将所有函数调用推迟到该子类?
Client(AbstractThing):
def __init__(self):
thing_name = os.environ('THING')
self.thing = getattr(sys.modules[__name__], thing_name)
def action1(self):
return self.thing()
def action2(self):
return self.thing()
或者有更好的方法吗?
我认为您想要的是一个将env-var值与适当实现相关联的工厂函数。
def make_client() -> AbstractThing:
return {
"THING1": Thing1,
"THING2": Thing2,
}[os.environ('THING')]()
然后在其他地方:
client = make_client()
client.action1()
如果Thing
是有状态的,并且您希望确保只有其中一个,那么您可能希望将其与singleton模式结合起来。