Python使用类和模块实现跨文件共享全局变量的一种方法

翻译 Matlab 程序到 Python 时发现 Python 的 global 变量仅在当前文件内有效,因此需要找到一种方法实现跨文件的全局变量。

Python导入Model 时是导入同一个Model文件中的对象,因此可以用模块跨文件共享变量,故实现方法如下:

from typing import Any, Iterable, TypeVar


NameType = TypeVar('NameType', str, Iterable[str])


class GlobalVariable:
    def __init__(self) -> None:
        pass
    
    def all(self):
        attrs = [i for i in dir(self)]
        attr = []
        for i in range(len(attrs)):
            if len(attrs[i]) > 1:
                if '__' == attrs[i][:2]:
                    continue
            if attrs[i] in ['all', 'add', 'rm', 'get']:
                continue
            
            attr.append(attrs[i])
        return attr
        
    def add(self, name:NameType, value:Any):
        if isinstance(name, Iterable) \
            and (not isinstance(value, Iterable)):
            raise TypeError("value should be Iterable when name is Iterable")
        if type(name) is str:
            name = [name]
            value = [value]
            
        for n, v in zip(name, value):     
            exec('self.{}={}'.format(n, v))
        
    def rm(self, name:NameType):
        if type(name) is str:
            name = [name]
        for n in name:
            self.__delattr__(n)
    
    def get(self, name:NameType):
        if type(name) is str:
            return self.__getattribute__(name)
        else:
            attrs = []
            for n in name:
                attrs.append(self.__getattribute__(n))    
            return attrs
        

global  globalVariables

try: 
    tmp = globalVariables.all()
except NameError:
    globalVariables = GlobalVariable()
else:
    pass

将上述代码打包进 GlobalVariable.py 文件作为Python 模块,保存变量。

将变量打包进GlobalVariable类的 globalVariable实例中方便管理,同时增加 add(), rm(), all()方法方便对变量进行操作。

使用类属性管理变量,内存占用应该能比字典方式低。文件最后try-except语句自动实例化类,简化操作。

使用前仅需将GlobalVariable.py文件添加进可 import 的路径或用 sys.path.append 方法添加文件路径,然后

from GlobalVariable import globalVariables as gbv

添加变量:

# 添加一个名为 newVariable 的变量
# 方法一
gbv.newVariable = 199

# 方法二
gbv.add('newVariable', 199)


# 添加一系列变量
nameList = ['a', 'b', 'c']
valueList = [100, 200, 300]
gbv.add(nameList, valueList)

获取变量值:

# 方法一
gbv.varName

#方法二
gbv.get('varName')

nameList = ['name1', 'name2', 'name3']
gbv.get(nameList)

删除变量:

gbv.rm('variableName')

显示所有变量名:

gbv.all()

仓库见:

https://gitee.com/ddddavid-he/global-variable.git

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值