Python模块全局变量
我有以下代码,但我想将其转换为模块。 显然,如果我将此代码miport为modulePython模块全局变量,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
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
对象进行写入