如何实现不同模块中对象之间的交互

2024-06-07 03:58:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我不知道如何使一个对象成为全局的。如果我在pythonshell中输入topology,那么它会显示对象拓扑,所以为什么消息不能看到它呢?你知道吗


Tags: 模块对象importself网络消息networkdestination
1条回答
网友
1楼 · 发布于 2024-06-07 03:58:42

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

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

如果不可能,您可以将拓扑值放在可由Message代码导入的模块的命名空间中。不过,这可能会变得混乱,因为如果不小心,循环导入可能会破坏东西。你知道吗

相关问题 更多 >