我想根据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')
有什么想法吗?
答案 0 :(得分:1)
因此,在研究了python日志记录的工作方式之后,我提出了一个解决方案。
所有类均保持不变,但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')
有什么想法吗?