首页 > 解决方案 > 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-3.xinheritancetoggle

解决方案


因此,在研究了 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')

有什么想法吗?


推荐阅读