Я хотел бы переключаться между двумя реализациями одного и того же класса в зависимости от переменной среды в файле 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')
есть идеи?
Итак, после исследования того, как работает ведение журнала 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')
Есть предположения?