首页 > 编程语言 >python设计一个跨模块全局变量

python设计一个跨模块全局变量

时间:2023-07-22 13:23:28浏览次数:27  
标签:__ string python self json 模块 path 全局变量 属性

python中有时候需要用到全局变量, 并且这个全局变量需要跨文件, 跨模块共享.
为此, 我设计了一个全局对象, 它有以下特点:

  • 如果为不存在的属性赋值, 则会自动生成这个属性, 后续就可以正常引用这个属性, 就像对象本身具有此属性一样
  • 整个对象可以序列化, 后续可以从文件中恢复
  • 对于以_开头的变量不进行序列化
  • 一个不足之处是对于用户自定义属性不支持代码自动补全, 可以创建一个继承自这个对象的类来支持自动补全
    代码如下:
import jsonpickle
import os
import Common

class G:
    '''存放全局变量的类'''
    #def __getattr__(self, name): return None    # 访问不存在的属性时, 返回None
    def __setattr__(self, name, value): 
        '''不管属性是否存在, 都设置属性的值'''
        object.__setattr__(self, name, value)
    def __getstate__(self):
        '''对于jsonpickle模块, 决定序列化哪些属性, 以'_'开头的属性不序列化'''
        state = self.__dict__.copy()
        # 创建一个临时副本进行迭代和删除操作
        temp_dict = state.copy()
        for key in temp_dict.keys():
            if key.startswith('_'): del state[key]
        return state
    def save(self,path:str='Data.json'):
        '''把当前对象保存到文件'''
        # 将类的实例保存为JSON格式
        json_string = jsonpickle.encode(self, indent=4)
        # 将JSON字符串中的Unicode编码字符转换为原始字符
        decoded_string = json_string.encode().decode('unicode_escape')
        decoded_string = decoded_string.replace('\\', '\\\\')   # 防止\d+出错
        Common.WriteAllText(path,decoded_string)
    def Restore(path:str='Data.json')->'G':
        '''恢复对象'''
        if not os.path.exists(path): return None
        json_string = Common.ReadAllText(path)
        obj = jsonpickle.decode(json_string)
        return obj
g = G()		# 在别的文件中可以直接引用全局变量g即可

标签:__,string,python,self,json,模块,path,全局变量,属性
From: https://www.cnblogs.com/huzhongqiang/p/17573107.html

相关文章

  • python接口自动化项目部署在centos7上
    我选择在apache根目录下/var/www/html创建一个目录test 切换到test目录下 进入创建的目录,并初始化git,输入命令gitinit如果会报错InitializedemptyGitrepositoryin/var/www/html/test/.git/,就输入yum-yupdate用于更新系统中安装的软件包到最新可用版本。 再次输......
  • 整理salt的grain模块
    #查找salt-minion之grains首先配置为默认的:查看配置文件:/et/salt/minion文件中,参数default_include,默认为minion.d/*.conf/etc/salt/minion.d/1.confgrains:wusen:name:无敌战神sudosystemctlrestartsalt-minionsalt-callgrains.itemwusen这样就是在grain......
  • python 执行多个任务, 哪个任务先返回用这个任务的结果,其他任务停止
        #coding=utf-8"""@project:icnet@Author:angdh@file:demo.py@date:2023-07-2210:58"""importconcurrent.futuresimportrequestsdeftask(url):#执行任务的代码result=requests.get(url,tim......
  • 【雕爷学编程】Arduino动手做(100)---MAX30102手腕心率模块2
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 使用Python内置的错误信息
    1'''2语法1:3try:4可能引发异常的代码块5except异常类ase:#使用e作为其别名6异常处理代码块7'''8910defdivision(x,y):11try:12returnx/y13except(ZeroDivisionError,TypeError)as......
  • 【雕爷学编程】Arduino动手做(52)---MicroSD卡读写模块3
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问......
  • c#怎么开发和设计游戏模块
    ​首先是UnityWebRequest的构建与数据发送:UnityWebRequestwebRequest=newUnityWebRequest(url,"POST");//初始化使用POST的UnityWebRequest,并附上目标地址webRequest.SetRequestHeader("","");//设置HTTP的头信息//初始化UnityWebRequest的downloadHandler与upl......
  • 【雕爷学编程】Arduino动手做(52)---MicroSD卡读写模块4
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题......
  • Python 预习提纲
    以下是Python的预习提纲的Markdown格式示例:Python预习提纲1.Python基础Python的历史与特点Python解释器与开发环境的安装Python开发工具与常用IDE2.数据类型与运算变量与赋值语句数字类型与基本运算字符串类型与常见操作列表、元组与字典的定义与操作3......
  • Python和Java的BASE64操作
    Python中的操作1.1相关链接Python编码解码---字符集/base641.2举例说明在Python中,base64.b64encode()方法用于对给定的字节数据进行Base64编码。该方法接受一个bytes-like对象(例如字节数组或字节字符串)作为输入,并返回一个Base64编码的字节字符串。使用base64.b64encode()......