Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 跨新对象实例共享变量_Python_Inheritance_Global Variables - Fatal编程技术网

Python 跨新对象实例共享变量

Python 跨新对象实例共享变量,python,inheritance,global-variables,Python,Inheritance,Global Variables,背景: 我正在写一个模块来建立一个嵌入式系统。在这种情况下,我需要加载一些模块并执行一些系统设置 上下文: 我有一个父类,其中包含一些用于几个子类的通用代码(加载配置文件、构建ssh连接等)。其中一个是设置模块的模块类,因此使用ssh连接和配置文件。 我的目标是与下一个将要安装的模块共享配置文件和连接。对于连接来说,一直构建和销毁它只是一种浪费,但是对于配置文件,安装过程中的更改可能会导致未定义的行为 研究/方法: 我尝试使用类变量,但是初始化时没有传递它们 一个新的模块对象 此外,我尝试使用

背景: 我正在写一个模块来建立一个嵌入式系统。在这种情况下,我需要加载一些模块并执行一些系统设置

上下文: 我有一个父类,其中包含一些用于几个子类的通用代码(加载配置文件、构建ssh连接等)。其中一个是设置模块的模块类,因此使用ssh连接和配置文件。 我的目标是与下一个将要安装的模块共享配置文件和连接。对于连接来说,一直构建和销毁它只是一种浪费,但是对于配置文件,安装过程中的更改可能会导致未定义的行为

研究/方法:

  • 我尝试使用类变量,但是初始化时没有传递它们 一个新的模块对象

  • 此外,我尝试使用全局变量,但由于父类和 子类位于不同的文件中,这将不起作用(是的,我可以将它们放在 所有文件都在一个文件中,但这将是一个混乱)还使用了来自的getter函数 我定义全局变量的文件不起作用

  • 我从中了解到“内置”解决方案 变量,但我觉得这有点过分了

  • 最后,我可以将配置文件和连接保存在中央数据库中 脚本并将它们传递给每个实例,但这将导致加载 我认为这不是一个好的解决方案

下面是一段代码和一个示例方法,用于获取一些文件路径。 代码根据方法1(类变量)设置

配置文件示例:

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是一个可变变量,而您使用的其他变量可能不是。可变变量在启动时只分析一次,然后任何更改都会全局反映出来。当您在整个应用程序中需要一个恒定的真实来源,而无需检查配置文件或数据库时,这种方法非常有效