【问题标题】:How to enable interaction between object in different modules如何启用不同模块中对象之间的交互
【发布时间】:2013-03-30 15:35:05
【问题描述】:

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

【问题讨论】:

    标签: python simpy


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多