Я разрабатываю игрушечный криптопроект, который включает в себя обучение моделей keras и их последующее развертывание в лямбде AWS. Я тестирую модели локально и развертываю их как лямбда-функции в AWS. Некоторые классы используются как локально, так и во время вызова лямбда-выражений, но у них совершенно разная внутренняя работа. Например, класс Asset реализует метод current_price, но в одном случае он вызывает API, а в другом — локальную базу данных.
Я подумал об использовании переменных среды, чтобы различать две среды. Как создать экземпляр одного и того же класса с другим набором методов или разными реализациями методов на основе переменной среды? Есть ли лучший подход к этой проблеме? Я пишу на питоне.
P.S. Основываясь на комментариях и ответах, я реализовал следующее решение:
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 method_local(self):
print(self.param)
class Asset_lambda(Base):
def __init__(self, param_lambda = 'Lambda'):
super().__init__()
self.param = param_lambda
def method_lambda(self):
print(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()
Это позволяет мне хранить общие части кода в родительском классе, реализовывать отдельные функции в отдельных классах и скрывать все это от кода, вызывающего класс.
@juanpa.arrivillaga Может ли метод init сделать доступным только подмножество методов класса?
Если вы действительно этого хотите, вы можете определять методы условно. if ...: def some_method(self): ... Но, возможно, проще хранить атрибут в __init__ и обеспечить, чтобы поведение каждого метода обращалось к этому атрибуту, чтобы определить, что он должен делать.






Вы можете определять методы условно...
class MyClass:
if some_condition:
def some_method(self):
...
else:
def another_method(self):
...
Но это как-то неловко. Обычно лучше, чтобы класс всегда имел одни и те же методы, а их поведением можно управлять с помощью параметров, композиции или других средств.
class Myclass:
def __init__(self, execution_mode: Literal['lambda', 'local']):
assert execution_mode in ('lambda', 'local'), "Invalid execution mode"
self.execution_mode = execution_mode
def _some_method_lambda(self):
... # implementation when running in lambda
def _some_method_local(self):
... # implementation when running locally
def some_method(self, *args, **kwargs):
if self.execution_mode == 'local':
self._some_method_local(*args, **kwargs)
elif self.execution_mode == 'lambda':
self._some_method_lambda(*args, **kwargs)
...
if os.environ.get('EXECUTION_ENVIRONMENT') == 'lambda':
my_instance = MyClass(execution_mode='lambda')
else:
my_instance = MyClass(execution_mode='local')
Или что-то вроде этого. Есть много способов разрезать это.
Как бы вы сделали то же самое, но с двумя разными
intобъектами, скажемif env_var === whatever...