python-3.x - Python 在两个类实现之间切换干净的代码
问题描述
我想根据操作系统中的环境变量在同一类的两个实现之间切换。我想使用它的一种情况是,它可以在登录到远程服务器和登录到本地磁盘之间切换。
到目前为止,我有以下实现:
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
已删除,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')
有什么想法吗?
推荐阅读
- routes - NestJs 在所有路由上使用中间件
- python - 值是列表时如何对python字典进行排序?
- python - 如何在熊猫中按两列分组,两者的组合是唯一的
- xcode - React native - 使用未声明的标识符“RCTDevLoadingView”
- python - 将 FiniteSet 对象转换为 python 列表
- janusgraph - Gremlin GraphTraversalSource 检索具有基数的顶点属性
- reactjs - React Material UI v5 createShallow testing-util 无法导入
- authentication - Shibboleth SSO - 令牌/Cookie 请求
- python - 从 [any] 字典(动态)创建类实例属性
- flutter - 颤振:到期日期文本字段