在Python中模块之间传递数据的奇怪方法:它是如何工作的?

时间:2014-05-07 12:30:02

标签: python class instance interpreter

我应该使用一些我自己没有编写的混乱代码,在混乱中我发现了两个以这种奇怪的方式进行通信的脚本(通过第三个中间人脚本):

message.py,'中间人'脚本:

class m():
    pass

sender.py,想要向收件人发送一些信息:

from message import m

someCalculationResult = 1 + 2
m.result = someCalculationResult

receiver.py,想要打印sender.py生成的一些结果:

from message import m

mInstance = m()
print mInstance.result

而且,通过魔术,在解释器中,导入sender.py然后receiver.py确实打印3 ...

现在,幕后到底发生了什么?我们是将结果存储到类定义本身并通过特定实例恢复它们吗?如果是这样,为什么我们不能从定义本身恢复结果呢?是否有一种更优雅的方式来传递在解释器中过度运行的脚本之间的东西?

使用Python 2.6.6

1 个答案:

答案 0 :(得分:4)

这只是设置全局的一种令人费解的方式。

m是一个类,m.result是一个类属性。发件人和收件人都可以直接访问它,就像他们可以访问m一样。

他们也可以做到这一点:

# sender
import message
message.result = someCalculationResult

# receiver
import message
print message.result

此处result只是message模块顶级模块中的名称。

应该注意的是,你正在做的是运行单独的脚本;您是将模块导入同一个解释器。如果您首先运行python sender.py,而没有导入reciever.py,那么单独运行python receiver.py而不导入sender.py这整个方案都无法运行。

有很多方法可以将数据从一个代码段传递到另一个段,这里有太多的名称,所有这些都适合不同的场景和需求。例如,线程,单独的进程,单独的计算机都会对如何传递消息传递引入不同的约束。