python跨文件使用全局变量
全局变量
某一函数内部定义的变量,要想让它在该文件的所有地方都可以使用,就需要将其定义为全局变量。但是python的全局变量不像c++那样可以跨文件使用,从文件中引用的话又有可能造成循环引用。
循环引用
- 现在有2个文件:主文件a.py,其他两个文件b.py,c.py。
- a.py里面使用了b.py和c.py中定义的类Class-b,Class-c,所以在a中有两行代码:from b import Class-b,from c import Class-c
- a.py中定义了1个全局变量global g1,b.py和c.py也要用这个全局变量,但是不能在b.py或c.py中写from a import g1,这会造成a引用了b、b也引用了a,即循环引用。
解决办法
再写一个py文件,里面定义一个类GlobalVar,负责处理变量,让没有被定义成全局变量的变量可以跨文件使用,如下图:
class GlobalVar:#全局变量类
def init (self):
self.global_dict={} # 初始化全局变量字典
def set_value(self, key, value):
self.global_dict[key]=value#将全局变量加入字典,即定义一个全局变量
def get_value(self, key):
try:
return self.global_dict[key]#访问全局变量,不存在则提示读取对应变量失败
except:
print('读取'+key+'失败\r\n')
def create():# 创建一个全局变量类的对象
global g# 该对象是一个全局变量,这样通过global_var.g就可以调用,而不必执行create函数g=GlobalVar()
g=GlobalVar()
- 在主文件a.py的main函数(或if __name__ == “__main__”)里面:
import global_var
global_var.create()
- create函数一执行就会创建一个全局变量:GlobalVar类的对象g。接下来就可以通过global_var.g访问对象g了,也可以使用GlobalVar类中的函数。如通过global_var.g.set_value(“g1”,g1)将变量g1加进去,而g1不必再global g1那样定义,就可以像全局变量那样使用。
- 在b.py与c.py中,同样import global_var,然后可以同样的方式global_var.g访问对象g。如通过global_var.g.get_value(“g1”)使用变量g1.
- g是create函数中的,一定要定义成一个全局变量,这样才能通过global_var.g进行访问,否则g只作用与create函数内。
- g1 不需要定义成全局变量,只要将它set_value加进字典里,就可以跨文件使用了。