python - 如何在 Python 中覆盖 PySerial 的 "__del__"方法?

标签 python serial-port overriding pyserial

我设置了一个简单的 Python 脚本,用于将字符发送到 COM3 上的设备。 (这是在 Windows XP 上运行) 设备可以正常接收字符,但是当脚本结束时,或者我调用

ser.close()      #ser is an instance of the `serial` method `Serial`

它将串行端口上的 DTR 线设置为高电平,重置我的设备。

对此感到困惑,我翻阅了 PySerial 文档 (http://pyserial.sourceforge.net/),发现模块有一个 __del__ 方法,它调用 ser.close() Serial 实例被删除时的功能。

有没有办法覆盖这个 __del__ 方法?

(我宁愿不必断开我设备的重置线与 DTR 线的连接)

下面是我使用的基本代码:

import serial
ser = serial.Serial()
ser.port = 2      #actually COM3
ser.baudrate = 9600
ser.open()
ser.write("Hello")
ser.close()

最佳答案

当然,继续并覆盖它。您可以创建 Serial 的子类并指定一个什么都不做的 __del__() 方法并使用子类而不是 Serial,或者删除它使用 del 语句从实际的 Serial 类(monkey-patching)中获取方法。前一种方法是首选,但如果您无法控制的代码正在使用串行端口,则第二种方法可能是必需的。当然,要确保 __del__() 方法在覆盖它之前不会做任何其他重要的事情。

子类化:

import serial

class mySerial(serial.Serial):
    def __del__(self):
        pass

ser = mySerial()
# rest of script the same

猴子补丁:

import serial

del serial.Serial.__del__

如果您有此模块的 Python 源代码(即它不是用 C 语言编写的),第三种方法是创建您自己的副本并只是编辑它而不是这样做。 (您也可以为 C 模块执行此操作,但如果您没有 C 专业知识,让它运行起来会有点困难。)

当然,将 __del__() 方法更改为不调用 ser.close() 对您提供的代码没有多大帮助,因为您自己重新调用 ser.close()。 :-)

关于python - 如何在 Python 中覆盖 PySerial 的 "__del__"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780830/

相关文章:

java - 如何刷新 Java 串行 InputStream?

java - 方法引用是否摆脱了可重写的方法调用?

java - 尝试在 scala 中重写 getListCellRenderComponent 方法时出现对象创建不可能错误

python - 如何在 python 中为 AES 生成强一次性 session key

python - Django:模型表单 "object has no attribute ' clean_data'"

python - Plotly 中同一 X 轴和 Y 轴上的多个条形图

python - 从 Docker 启动 uwsgi

Linux:多重 SIGIO 问题(异步串行通信)

c++ - 串行端口上的失真答案

android - 如何重写一个函数?