python中针对类的不同版本的最佳实现,所有这些都具有相同的方法,这些方法将根据环境变量进行选择



所以我有很多函数,每个函数都对服务进行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模式结合起来。

相关内容

  • 没有找到相关文章

最新更新