Python Переключение между двумя реализациями класса чистый код

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

то, что у меня есть до сих пор, это следующая реализация:

import abc
class AbstractLogger(object):

    @abc.abstractmethod
    def log(message):
        pass




class LocalLogger(AbstractLogger):

    def __init__(self):
     # open file here

    def log(self, message):
        print('write to file')




class RemoteLogger(AbstractLogger):

     def __init__(self):
        # open socket here

    def log(self, message):
        print('write to socket')



import os
class mode(object):
is_local=os.getenv('key')
    mylogger=None

@staticmethod
def get_logger():
  if mode.is_local and mode.logger is None:
      mode.mylogger=LocalLogger()
  else:
      mode.logger=RemoteLogger()
  return mode.mylogger

тогда использование моего кода будет таким:

from mode import mode
mode.get_logger().log('write this')

или

from mode import mode
logging=mode.get_logger()
logging.log('write this')

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

import mode
mode.log('joy')

есть идеи?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Итак, после исследования того, как работает ведение журнала Python, я нашел решение.

весь класс остается прежним, но class mode который удален, а файл режим.py:

import os

mylogger=LocalLogger() if os.getenv('key')=='value' else RemoteLogger()

@staticmethod
def log(message):
    mylogger.log(message)

то я могу сделать:

import mode
mode.log('joy')

Есть предположения?

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