0

所以我有很多函数,每个函数都对服务进行 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()

或者,还有更好的方法?

4

1 回答 1

1

我认为您想要的是一个工厂函数,它将 env var 值与适当的实现相关联。

def make_client() -> AbstractThing:
    return {
        "THING1": Thing1,
        "THING2": Thing2,
    }[os.environ('THING')]()

然后在其他地方:

client = make_client()
client.action1()

如果Thing是有状态的并且您想确保只有其中一个,您可能希望将其与单例模式结合起来。

于 2021-12-09T18:45:23.133 回答