我有下面的代码,但我想把它转换成模块。
显然,如果我将此代码作为模块ser_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
的情况下访问Serial
内部的Serial
?用户可以创建一个Serial
实例,但是我不知道应该在Agent
中使用的名称。我可以创建init
方法,然后在里面创建Serial
类。导入后,用户将调用init
方法,然后就可以使用它了。在
不,这一点都不明显,事实上是错误的。导入模块运行所有顶层代码。这里没有问题,
ser_r
和ser
与其他所有内容一起创建。在类在这里并不特殊;
class Serial: ...
只是另一个顶层语句,就像ser_r
和ser
assignment语句一样。在请注意,该模块为该模块中的所有代码形成了全局命名空间。在}将已经存在。在
Agent.send()
中,名称ser
是一个全局名称,通过查看附加的模块全局变量来解析该名称,其中{但是,代码中确实存在错误:
没有定义全局名
^{pr2}$self
,因此self.ser_raw
也不存在。也许您是想在ser_r
周围创建包装器?在这意味着您实际上不必使用
Serial
类。它没有状态(只有类属性),因此您根本不需要创建实例,您可以将其视为全局的(正如您的第二次尝试已经做了)。因为您已经可以从Agent().send()
访问Serial
全局,所以使用您的模块的任何人都不必知道Serial
或创建它的实例。在如果您不想使串行连接成为全局的,您可以始终在
Agent.__init__()
中创建连接,或者让该类接受一个合适的io.TextIOBase
对象来写入。在相关问题 更多 >
编程相关推荐