Python模块全局变量

Python模块全局变量,python,pyserial,Python,Pyserial,我有以下代码,但我想将其转换为模块。 显然,如果我将此代码miport为moduleser\u r和ser将永远不会初始化,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

我有以下代码,但我想将其转换为模块。 显然,如果我将此代码miport为module
ser\u r
ser
将永远不会初始化,
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
内部
Agent
而不创建
Serial
的实例?用户可以创建一个
Serial
实例,但是我不知道应该在
Agent
中使用哪个名称。我可以创建
init
方法,然后在内部创建
Serial
类。导入后,用户将调用
init
方法,然后他就可以使用它了

#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
        Serial.ser.write(message)



class Serial:
    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)
显然,如果我将此代码作为模块
ser\u r
导入,
ser
将永远不会初始化,
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)
不,这一点都不明显,事实上是错误的。导入模块将运行所有顶级代码。这里没有问题,
ser\u r
ser
与其他内容一起创建

这里的课程并不特别
class Serial:…
只是另一个顶级语句,就像
ser\u r
ser
assignment语句一样

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

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

ser = io.TextIOWrapper(io.BufferedRWPair(self.ser_raw, self.ser_raw, 1),
                   newline='\r',
                   line_buffering=True)
没有定义全局名称
self
,因此
self.ser_raw
也不存在。也许您想在
ser\r
周围创建包装器

ser = io.TextIOWrapper(io.BufferedRWPair(ser_r, ser_r, 1),
                       newline='\r', line_buffering=True)
这意味着您实际上不必使用
Serial
类。它没有状态(只有类属性),所以无论如何都不需要创建实例,只需将其视为全局实例(正如第二次尝试所做的那样)。由于您已经可以从
Agent().send()
访问
Serial
全局,因此使用模块的任何人都无需了解
Serial
或创建其实例

如果不想将串行连接设为全局连接,则始终可以在
代理中创建连接。\uuuu init\uuuu()
,或者让该类接受适当的
io.TextIOBase
对象进行写入

显然,如果我将此代码作为模块
ser\u r
导入,
ser
将永远不会初始化,
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)
不,这一点都不明显,事实上是错误的。导入模块将运行所有顶级代码。这里没有问题,
ser\u r
ser
与其他内容一起创建

这里的课程并不特别
class Serial:…
只是另一个顶级语句,就像
ser\u r
ser
assignment语句一样

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

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

ser = io.TextIOWrapper(io.BufferedRWPair(self.ser_raw, self.ser_raw, 1),
                   newline='\r',
                   line_buffering=True)
没有定义全局名称
self
,因此
self.ser_raw
也不存在。也许您想在
ser\r
周围创建包装器

ser = io.TextIOWrapper(io.BufferedRWPair(ser_r, ser_r, 1),
                       newline='\r', line_buffering=True)
这意味着您实际上不必使用
Serial
类。它没有状态(只有类属性),所以无论如何都不需要创建实例,只需将其视为全局实例(正如第二次尝试所做的那样)。由于您已经可以从
Agent().send()
访问
Serial
全局,因此使用模块的任何人都无需了解
Serial
或创建其实例

如果不想将串行连接设为全局连接,则始终可以在
代理中创建连接。\uuuu init\uuuu()
,或者让该类接受适当的
io.TextIOBase
对象进行写入