我试图在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。我不确定如何得到正确的结果。
有谁知道解决问题的正确方法?
提前致谢!
答案 0 :(得分:3)
您永远不会致电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
个对象共享该属性值,则必须永远不要为特定实例分配它,因为那个实例将拥有自己的值。
<强>&#34;单例&#34;对象强>
您可以在data
中声明类型为a的单个对象,而不是在main中创建新对象ModuleA
:
class A(object):
...
data = A()
现在,在您的主模块中,您可以像这样使用它:
from ModuleA import data
print(data.set1)
但您必须始终确保所有模块都使用 单个对象,并且不要创建自己的A
。