我试图在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(...)
, set1
和set2
的值将为0,直到您这样做。
通过实例化类来调用__init__(self)
:
data = A()
设置data.set1
和data.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.a
和data2.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
。