Python:在模块之间共享变量



我试图在python的两个独立模块之间共享变量。一般来说,我要做的是,

class A:
    def __init__(self):
          self.set1 = 0
          self.set2 = 0
    def count(self, data):
        parse throught the data in here...
        self.set1 = data[0:2]
        self.set2 = data[5:20]

-------------------------------------------- 
from moduleA import A
def main():
    data = A()
    print(data.set1)
    print(data.set2)
if __name__ == '__main__': main()

,但这不起作用。它只会为set1和set2打印0。我不确定怎样才能得到正确的结果。

有谁知道解决我的问题的正确方法吗?

提前感谢!

您从未调用count(...), set1set2的值将为0,直到您这样做。

通过实例化类来调用__init__(self):

data = A()

设置data.set1data.set2都为0。


更新:遵循OP的评论。

当你在主模块中创建一个新的A对象时,你正在创建该对象的一个新实例。每个实例都有它自己的属性版本,所以如果我这样做:

data1 = A()
data2 = A()
data1.set1 = "some value"

则下列语句为假:

data1.set1 == data2.set1

两个对象都有自己的实例属性集。

要达到你想要的,你可以做两件(明智的)事情:

  • 将数据存储在本身
  • 有一个在ModuleA中声明的单例对象,所有其他模块都使用

下面将详细说明

类属性

如果在类定义中声明一个属性,而不是使用' init(self,…)方法,这些属性将在每个实例之间共享,至少在初始阶段是这样。

一个例子:

class A(object):
     a = []

现在如果我这样做:

 data1 = A()
 data2 = A()
 data1.a.append('some value')

data1.adata2.a将是相同的列表,具有相同的值。

就像我说的,这只是最初,如果你曾经分配给a,那么他们将引用不同的东西,不会是相同的。我可以将data1.a重新绑定到其他内容,并且data2.a将具有原始值:

 data1.a = ["another value"]
 print(data1.a) # prints ["another value"]
 print(data2.a) # prints ["some value"]

如果你想让所有的A对象共享这个属性值,你永远不能为一个特定的实例分配它,因为那样的话,那个实例将有它自己的值。

"单"对象

可以在ModuleA中声明一个a类型的对象,而不是在main中创建一个新的对象data:

 class A(object):
      ...
 data = A()

现在,在你的主模块中你可以这样使用它:

 from ModuleA import data
 print(data.set1)

但是你必须始终确保你的所有模块都使用那个单个对象,并且不要创建它们自己的A

最新更新