繁体   English   中英

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

[英]How to enable interaction between object in different modules

我正在使用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中输入拓扑,那么它将显示对象拓扑,那么为什么看不到消息呢?

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

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

如果这不可能,则可以将拓扑值放在Message代码可以导入的模块的命名空间中。 但是,这可能会变得混乱,因为如果您不小心的话,循环导入会破坏事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM