Python Переключение между двумя реализациями классов чистый код - PullRequest
0 голосов
/ 29 мая 2019

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

На данный момент у меня есть следующая реализация:

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

есть идеи?

1 Ответ

1 голос
/ 29 мая 2019

Итак, после исследования того, как работает python logging, я придумаю решение.

все классы остались прежними, но class mode удалили, а 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')

есть мысли?

...