如何基于环境变量为Python类配置不同方法实现?
基于环境变量实例化不同实现的Python类(本地/AWS Lambda场景)
问题描述
我正在开发一个加密货币玩具项目,涉及训练Keras模型并部署到AWS Lambda。本地测试模型后再部署为Lambda函数,部分类会同时用于本地和Lambda调用,但内部实现差异极大——比如Asset类的current_price方法,本地环境调用本地数据库,Lambda环境则调用API。我想通过环境变量区分两种环境,请问如何基于环境变量实例化具有不同方法实现的同一类?是否有更优方案?
最终实现方案
我采用了父类封装通用逻辑、子类实现差异化功能,通过工厂模式(利用__new__方法)根据环境变量动态返回对应实例的方案,代码如下:
import os class Base: def __init__(self, param_base='Base'): self.param_base = param_base def method_base(self): print(self.param_base) class Asset_local(Base): def __init__(self, param_local='Loc'): super().__init__() self.param = param_local def current_price(self): # 本地环境:调用本地数据库的实现 print(f"本地数据库获取价格,参数:{self.param}") class Asset_lambda(Base): def __init__(self, param_lambda='Lambda'): super().__init__() self.param = param_lambda def current_price(self): # Lambda环境:调用API的实现 print(f"API获取价格,参数:{self.param}") class Asset(): def __new__(cls): env_var = os.environ['MY_VAR'] if env_var == 'Lambda': return Asset_lambda() if env_var == 'Local': return Asset_local()
方案优势
- 通用代码集中在
Base父类,避免重复编写; - 子类
Asset_local和Asset_lambda各自实现环境专属的方法逻辑,职责清晰; - 调用方只需实例化
Asset类,无需关心底层环境差异,实现了逻辑隐藏; - 通过环境变量
MY_VAR切换环境,符合AWS Lambda和本地开发的配置习惯。
内容的提问来源于stack exchange,提问作者Artem Lebedev
相关产品推荐
相关产品推荐

