Как настроить различные наборы методов класса на основе переменной среды?

Я разрабатываю игрушечный криптопроект, который включает в себя обучение моделей 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()

Это позволяет мне хранить общие части кода в родительском классе, реализовывать отдельные функции в отдельных классах и скрывать все это от кода, вызывающего класс.

Как бы вы сделали то же самое, но с двумя разными int объектами, скажем if env_var === whatever...

juanpa.arrivillaga 16.05.2024 01:07

@juanpa.arrivillaga Может ли метод init сделать доступным только подмножество методов класса?

Artem Lebedev 16.05.2024 01:29

Если вы действительно этого хотите, вы можете определять методы условно. if ...: def some_method(self): ... Но, возможно, проще хранить атрибут в __init__ и обеспечить, чтобы поведение каждого метода обращалось к этому атрибуту, чтобы определить, что он должен делать.

sytech 16.05.2024 01:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете определять методы условно...

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')

Или что-то вроде этого. Есть много способов разрезать это.

Другие вопросы по теме