如何在不同模块中启用对象之间的交互

时间:2013-03-30 15:35:06

标签: python simpy

我正在使用SimPy,我尝试模拟网络。

这是我的主要模块:

from SimPy.Simulation import *
import node0
import message0
import network0
reload (message0)
reload (node0)
reload(network0)
initialize()
topology=network0.Network()
activate(topology, topology.operate()) 
node1=node0.Node(1)
node1.interface.send(destination='node1')
simulate(until=25)

我想要一个类消息的对象,它由类节点的对象激活,以中断

class Message(Process):
    def arrive(self, destination, myEvent=delay):

        self.destination=destination
        self.interrupt(topology)

班级Network (topology)的对象。

但是我收到了一个错误:

NameError: global name 'topology' is not defined

我不知道如何使对象全局化。如果我在python shell中键入拓扑,那么它会显示对象拓扑,那么为什么消息不能看到呢?

1 个答案:

答案 0 :(得分:0)

我很确定问题是您的Message类是在与topology变量不同的模块中定义的。 Python中所谓的“全局”变量并不是真正的全局变量(在某种意义上说只有一个全局命名空间),而是位于特定模块命名空间的顶部。因此,主模块命名空间中的全局变量topology无法作为来自不同模块的全局变量访问。

我建议通过将拓扑值作为Message方法的参数传递给__init__来解决此问题。如果消息是由您自己的代码之外的其他内容创建的(例如,通过您的Node类),则可能需要将其传递一些,以便在需要时可用。

如果无法做到这一点,您可以将拓扑值放在可由Message代码导入的模块的命名空间中。这可能会变得混乱,因为如果你不小心,循环导入会破坏事情。