2013-03-30 64 views
0

我正在使用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) 

我想类消息,它是由类节点的目的活化的目的,对interrrupt

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中输入拓扑结构,那么它会显示对象拓扑结构,为什么不能在消息中看到它?

回答

0

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

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

如果这是不可能的,您可能可以将拓扑值置于可由Message代码导入的模块的名称空间中。尽管如此,这可能会变得混乱,因为如果你不小心的话,循环导入会破坏事物。

相关问题