Python模块全局变量

2024-04-19 18:17:28 发布

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

我有下面的代码,但我想把它转换成模块。 显然,如果我将此代码作为模块ser_rser导入,将永远不会初始化Agent类。在

#module.py

class Agent:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def send(self, data):
        message = data + ' ' + a
        ser.write(message)

ser_r = serial.Serial(
                    port='COM6',
                    baudrate=500000,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    bytesize=serial.EIGHTBITS
                    )

ser = io.TextIOWrapper(io.BufferedRWPair(self.ser_raw, self.ser_raw, 1),
                   newline='\r',
                   line_buffering=True)

所以我想到了创建一个类Serial,它有ser变量,然后在Agent类中使用。在

但是现在有另一个问题:如何在不创建Serial的情况下访问Serial内部的Serial?用户可以创建一个Serial实例,但是我不知道应该在Agent中使用的名称。我可以创建init方法,然后在里面创建Serial类。导入后,用户将调用init方法,然后就可以使用它了。在

^{2}$

Tags: 模块方法代码用户ioselfmessagedata
1条回答
网友
1楼 · 发布于 2024-04-19 18:17:28

Obviously if I import this code as module ser_r and ser will never be initialized and Agent class won't work.

不,这一点都不明显,事实上是错误的。导入模块运行所有顶层代码。这里没有问题,ser_rser与其他所有内容一起创建。在

类在这里并不特殊;class Serial: ...只是另一个顶层语句,就像ser_rserassignment语句一样。在

请注意,该模块为该模块中的所有代码形成了全局命名空间。在Agent.send()中,名称ser是一个全局名称,通过查看附加的模块全局变量来解析该名称,其中{}将已经存在。在

但是,代码中确实存在错误:

ser = io.TextIOWrapper(io.BufferedRWPair(self.ser_raw, self.ser_raw, 1),
                   newline='\r',
                   line_buffering=True)

没有定义全局名self,因此self.ser_raw也不存在。也许您是想在ser_r周围创建包装器?在

^{pr2}$

这意味着您实际上不必使用Serial类。它没有状态(只有类属性),因此您根本不需要创建实例,您可以将其视为全局的(正如您的第二次尝试已经做了)。因为您已经可以从Agent().send()访问Serial全局,所以使用您的模块的任何人都不必知道Serial或创建它的实例。在

如果您不想使串行连接成为全局的,您可以始终在Agent.__init__()中创建连接,或者让该类接受一个合适的io.TextIOBase对象来写入。在

相关问题 更多 >