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

Python中,由于其解释型语言的特点,一般不鼓励直接在不同文件之间共享变量,因为这可能导致全局状态混乱难以管理。但是,如果你确实需要在模块共享数据,可以考虑以下几种方法: 1. **全局变量(Global Variables)**:可以在顶级作用域定义全局变量,通过import导入其他模块可以直接访问。但需谨慎使用,尽量避免污染全局命名空间。 ```python # module1.py global_variable = "Hello" # module2.py import module1 print(module1.global_variable) ``` 2. **共享字典(Shared Dictionary)**:在模块级别创建一个字典,并作为函数返回值或使用包(package)的方式提供给其他模块访问。 ```python from package.shared_data import shared_dict # shared_data.py shared_dict = {"key": "value"} # another_module.py import package.shared_data print(shared_dict["key"]) ``` 3. **使用模块级对象(Module-Level Objects)**:将变量定义在一个独立的模块里,然后让其他模块通过导入来使用。 4. **使用命名空间(Namespaces)**:利用Python的`__main__`、`sys.modules`等机制,或者第三方库如`multiprocessing`的`Manager`来创建共享的数据结构。 5. **使用配置文件(Configuration Files)**:对于复杂的系统,可能会选择使用配置文件来存储共享数据,而不是直接在代码中修改。 尽管有以上方法,通常推荐采用适当的设计模式,例如工厂模式、单例模式或者依赖注入,以及使用进程/线程安全的数据结构,以确保变量在并发环境下的正确性一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值