Python 跨新对象实例共享变量
背景: 我正在写一个模块来建立一个嵌入式系统。在这种情况下,我需要加载一些模块并执行一些系统设置 上下文: 我有一个父类,其中包含一些用于几个子类的通用代码(加载配置文件、构建ssh连接等)。其中一个是设置模块的模块类,因此使用ssh连接和配置文件。 我的目标是与下一个将要安装的模块共享配置文件和连接。对于连接来说,一直构建和销毁它只是一种浪费,但是对于配置文件,安装过程中的更改可能会导致未定义的行为 研究/方法:Python 跨新对象实例共享变量,python,inheritance,global-variables,Python,Inheritance,Global Variables,背景: 我正在写一个模块来建立一个嵌入式系统。在这种情况下,我需要加载一些模块并执行一些系统设置 上下文: 我有一个父类,其中包含一些用于几个子类的通用代码(加载配置文件、构建ssh连接等)。其中一个是设置模块的模块类,因此使用ssh连接和配置文件。 我的目标是与下一个将要安装的模块共享配置文件和连接。对于连接来说,一直构建和销毁它只是一种浪费,但是对于配置文件,安装过程中的更改可能会导致未定义的行为 研究/方法: 我尝试使用类变量,但是初始化时没有传递它们 一个新的模块对象 此外,我尝试使用
- 我尝试使用类变量,但是初始化时没有传递它们 一个新的模块对象
- 此外,我尝试使用全局变量,但由于父类和 子类位于不同的文件中,这将不起作用(是的,我可以将它们放在 所有文件都在一个文件中,但这将是一个混乱)还使用了来自的getter函数 我定义全局变量的文件不起作用
- 我从中了解到“内置”解决方案 变量,但我觉得这有点过分了
- 最后,我可以将配置文件和连接保存在中央数据库中 脚本并将它们传递给每个实例,但这将导致加载 我认为这不是一个好的解决方案
Files:
Core:
Backend:
- 'file_1'
- 'file_2'
Local:
File_path:
Backend: '/the/path/to'
setup_class.py中的父类
导入操作系统
进口abc
进口yaml
类设置(对象):
__元类_uu=abc.ABCMeta
配置=[]
def检查_的_配置(自我,配置文件):
如果不是自配置:
打开(配置文件,“r”)作为配置:
self.configuration=yaml.safe_load(配置)
def get_配置(自身):
返回自配置
定义生成文件列表(自身、路径、名称):
完整文件路径=[]
对于名称中的文件名:
临时路径=路径+'/'+文件名
temp_path=temp_path.split(“/”)
完整文件路径追加(os.path.join(*temp\u path))
返回完整的文件路径
@抽象方法
def安装(自动):
引发未实现的错误
module_class.py中的模块类
从设置\u类导入设置
课程模块(设置):
定义初始化(self,模块名,配置文件=“”):
self.name=模块名称
self.check\u获取配置(配置文件)
def安装(自动):
self._backend()
def_后端(自身):
文件=self.\u生成文件\u列表(
self.configuration['Local']['File_path']['Backend'],
self.configuration['Files'][self.name]['Backend'])
如果文件:
打印文件
最后是一个测试脚本:
from module_class import module
Analysis = module('Analysis',"./example.yml")
Core = module('Core', "./example.yml")
Core.install()
现在,在运行代码时,每次都会加载配置文件,并初始化一个新的模块对象。我想避免这种情况。有没有我没有考虑过的方法?实现这一点最简单的方法是什么?将全局值保存在全局dict中,并在模块中引用
cache = {}
class Cache(object):
def __init__(self):
global cache
self.cache = cache
非常感谢!我真的不明白dict与我以前尝试过的变量有什么不同,但无论如何,它工作得非常完美!因为python中的dict是一个可变变量,而您使用的其他变量可能不是。可变变量在启动时只分析一次,然后任何更改都会全局反映出来。当您在整个应用程序中需要一个恒定的真实来源,而无需检查配置文件或数据库时,这种方法非常有效