背景: 我正在编写一个模块来设置嵌入式系统。在这种情况下,我需要加载一些模块并执行一些系统设置。
上下文:我有一个父类,其中包含一些用于多个子类的通用代码(加载配置文件,构建 ssh 连接等)。其中之一是设置模块的模块类,因此使用 ssh 连接和配置文件等。我的目标是与下一个模块共享配置文件和连接,该模块将要设置。对于连接来说,一直构建和销毁它只是一种浪费,但对于配置文件,设置过程中的更改可能会导致未定义的行为。
研究/方法:
-
我尝试使用类变量,但是在启动时没有传递它们 一个新的模块对象。
-
此外,我尝试使用全局变量,但由于父类和 子类在不同的文件中,这行不通(是的,我可以把它们放 都在一个文件中,但这将是一团糟)还使用来自 我定义全局变量的文件不起作用。
-
我知道来自 如何制作跨模块变量? 可变的,但感觉这有点矫枉过正...
-
最后,我可以将配置文件和连接保存在一个中心 脚本并将它们传递给每个实例,但这会导致加载 的依赖关系,我认为这不是一个好的解决方案。
所以这里有一些带有示例方法的代码,用于获取一些文件路径。 代码根据方法 1(类可用值)设置
的示例配置文件:
Files:
Core:
Backend:
- 'file_1'
- 'file_2'
Local:
File_path:
Backend: '/the/path/to'
setup_class.py中的父类
import os
import abc
import yaml
class setup(object):
__metaclass__ = abc.ABCMeta
configuration = []
def check_for_configuration(self, config_file):
if not self.configuration:
with open(config_file, "r") as config:
self.configuration = yaml.safe_load(config)
def get_configuration(self):
return self.configuration
def _make_file_list(self, path, names):
full_file_path = []
for file_name in names:
temp_path = path + '/' + file_name
temp_path = temp_path.split('/')
full_file_path.append(os.path.join(*temp_path))
return full_file_path
@abc.abstractmethod
def install(self):
raise NotImplementedError
module_class.py中的模块类
from setup_class import setup
class module(setup):
def __init__(self, module_name, config_file = ''):
self.name = module_name
self.check_for_configuration(config_file)
def install(self):
self._backend()
def _backend(self):
files = self._make_file_list(
self.configuration['Local']['File_path']['Backend'],
self.configuration['Files'][self.name]['Backend'])
if files:
print files
最后是一个测试脚本:
from module_class import module
Analysis = module('Analysis',"./example.yml")
Core = module('Core', "./example.yml")
Core.install()
现在,在运行代码时,每次都会加载配置文件,并启动一个新的模块对象。我想避免这种情况。有没有我没有考虑过的方法?实现这一目标的最简洁方法是什么?
将全局值保存在全局字典中,并在模块中引用该值。
cache = {}
class Cache(object):
def __init__(self):
global cache
self.cache = cache