python:在模块之间共享变量

时间:2014-07-21 22:20:21

标签: 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。我不确定如何得到正确的结果。

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

提前致谢!

1 个答案:

答案 0 :(得分:3)

您永远不会致电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个对象共享该属性值,则必须永远不要为特定实例分配它,因为那个实例将拥有自己的值。

<强>&#34;单例&#34;对象

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

 class A(object):
      ...

 data = A()

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

 from ModuleA import data
 print(data.set1)

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