You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多文件场景下如何实现类似C风格的全局变量?

实现Python中类似C风格的跨文件全局共享对象

嘿,我完全懂你想要的那种跨文件共享、修改后全链路同步的全局对象——就像C里的全局变量那样,不用绕继承或者导入整个文件的麻烦。其实Python里有个非常直接的方案,利用模块的单例特性就能搞定,给你一步步演示:

核心思路

Python的模块在第一次被导入时会被加载并初始化,之后所有其他文件导入这个模块时,都会复用同一个模块实例。我们可以专门创建一个模块来存放需要全局共享的对象,所有需要使用它的文件都导入这个模块里的对象,这样所有修改都会直接作用在同一个实例上,实现全文件同步。

示例代码实现

1. 创建全局对象模块 globals.py

专门用来存放需要共享的系统状态对象:

# globals.py
class SystemState:
    def __init__(self):
        self.frequency = 50  # 初始系统频率
        self.power = 100     # 初始系统功率

# 实例化这个全局对象,所有文件都将共享这个实例
sys = SystemState()

2. class1.py - 使用并修改全局对象

# class1.py
from globals import sys

class Class1:
    def update_frequency(self, new_freq):
        # 直接修改全局sys对象的频率属性
        sys.frequency = new_freq
        print(f"Class1: 系统频率已更新为 {sys.frequency} Hz")
    
    def use_updated_power(self):
        # 使用Class2修改后的功率执行任务
        print(f"Class1: 当前系统功率为 {sys.power} W,正在执行任务...")

3. class2.py - 使用全局对象并修改其属性

# class2.py
from globals import sys

class Class2:
    def run_simulation(self):
        # 使用当前的全局频率进行模拟
        print(f"Class2: 正在以 {sys.frequency} Hz 的频率运行模拟...")
        # 修改全局对象的功率属性
        sys.power = 150
        print(f"Class2: 系统功率已更新为 {sys.power} W")

4. main.py - 启动流程并协调各模块

# main.py
from class1 import Class1
from class2 import Class2
from globals import sys

def main():
    # 可以在main里初始化或调整全局对象的初始状态
    sys.frequency = 60
    print(f"Main: 初始系统频率设置为 {sys.frequency} Hz")
    
    c1 = Class1()
    c2 = Class2()
    
    # 让Class1修改频率
    c1.update_frequency(70)
    # 让Class2用新频率模拟并修改功率
    c2.run_simulation()
    # 让Class1使用更新后的功率
    c1.use_updated_power()

if __name__ == "__main__":
    main()

运行效果

执行main.py后会输出:

Main: 初始系统频率设置为 60 Hz
Class1: 系统频率已更新为 70 Hz
Class2: 正在以 70 Hz 的频率运行模拟...
Class2: 系统功率已更新为 150 W
Class1: 当前系统功率为 150 W,正在执行任务...

为什么这个方案可行?

  • 所有文件导入的sys都是globals.py中创建的同一个实例,修改它的属性(比如sys.frequency)会直接作用在这个实例上,所有引用它的地方都会实时看到变化。
  • 避免了循环导入的问题:因为globals.py不依赖任何其他模块,其他模块只需要导入它即可。
  • 对比你提到的“导入定义全局变量的文件”方案:如果之前你是直接导入变量而非模块实例,可能会因为变量重新赋值导致引用失效,但这个方案中我们始终操作的是同一个对象的属性,不会出现这个问题。

内容的提问来源于stack exchange,提问作者Glostas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:55:27