何时在Pyserial中使用close()和__del__()?

3
根据 文档serial.Serial() 类具有以下方法。
close()
Close port immediately.

__del__()
Destructor, close port when serial port instance is freed.

我想知道什么时候应该使用close()__del__()?例如,我有一个创建了一个带有指定端口的serial.Serial()实例的GUI。根据文档,当serial.Serial()实例化时,分配的端口将被打开。现在,当我终止我的GUI时,我是否可以正确地说__del__()(而不是close())是关闭串口的最合适方法?

1
当您终止GUI时,__del__()将自动被调用... - Stephen Rauch
@StephenRauch 请问您知道serial.py模块中这条指令在哪里说明吗?我找不到。您能帮忙指出这条指令的位置吗? - Sun Bear
1个回答

1

分析

如果我们查看pyserial源码,我们会发现:

class SerialBase(io.RawIOBase):

啊哈!让我们看看io.RawIOBase

原始二进制I/O的基类。它继承了IOBase。没有公共构造函数。

好的。在IOBase中查找__del__,我们可以看到:

__del__()为对象销毁做准备。IOBase提供了此方法的默认实现,该方法调用实例的close()方法。

结论

您可以使用close()delwith-context - 它们都会关闭端口。


谢谢。注意到serial.Serial()对象中的.__del__()方法实际上是Python的io.IOBase()对象中的一个方法。在阅读了其他SO讨论__del__()的帖子之后,例如这个这个,我了解到__del__()是真正的Python特殊方法名称,用于自定义Python对象的最终化。 - Sun Bear
1
根据Python文档,执行__del __()可能会有问题。因此,在不再需要打开serial.Serial()对象实例中的端口的情况下,我认为应该立即使用.close()方法关闭端口,而不是使用.__del __()方法。 - Sun Bear
直接调用__methods__本身并没有问题 - 只是看起来有些奇怪。例如,使用someobject.__del__()而不是del someobject - Alex Yu
如果您查看源代码,您也可以看到__exit__方法会自动调用close()。所以:无论您如何调用,结果都是相同的。 - Alex Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接