python - 如何覆盖python对象中的方法?
问题描述
我在我的多线程应用程序中使用 sqlalchemy 和基于 postgres/psycopg2 的连接池。我发现数据库连接在某些代码路径中正在关闭。我正在尝试确定代码中发生这种情况的位置。
我正在使用psycopg2.connect()创建连接。连接对象有一个“关闭”方法,我相信它被称为关闭连接。为了找到位置,我试图像这样覆盖“close()”函数:
def newclose(self):
#print stack
self.oldclose()
c = psycopg2.connect(...)
c.oldclose = c.close
c.close = types.MethodType(newclose, c)
但是,我收到错误AttributeError: 'psycopg2.extensions.connection' object has no attribute 'oldclose'。我为我创建的类尝试了这种技术并且它有效。我认为这可能与在 C 中作为扩展模块实现的连接类有关。有什么方法可以修补 connection.close() 方法吗?当 connection.close() 被调用时,有没有其他方法可以找到调用堆栈?我没有附加调试器的选项。但我可以将消息打印到控制台进行调试。
甚至替换“关闭”方法的代码也失败了(单独调用时)-AttributeError:“psycopg2.extensions.connection”对象属性“关闭”是只读的
解决方案
而不是修补对象,您应该继承Connection
和覆盖close
:
class MyConnection(psycopg2.extensions.connection):
def close(self):
# print stack
super().close()
然后你可以告诉connect
使用你的自定义子类。
c = psycopg2.connect(connection_factory=MyConnection)
推荐阅读
- javascript - JavaScript Chrome 控制台 - 即使 Chrome 传感器位置初始化为马里兰州巴尔的摩 (UTC-5),日期偏移命令也会返回 UTC-8
- c# - HTTP 错误 413.1 - 请求实体太大抛出错误而不是增加大小
- javascript - 如何将“阅读更多”文本放在截断行的末尾 - Javascript
- html - 使用背景图像 css 样式预览多个图像 Vue JS
- joi - 如何转换对象模式的属性模式以派生新的对象模式?
- json - 在打包器json文件中设置thoughput时遇到以下问题,需要帮助来解决这个问题
- c++ - 在C函数中调用其他lua函数后如何在lua函数中返回值
- asp.net - 我的 Gmail API 突然停止通过我在 ASP.Net 中的应用程序发送电子邮件
- python - 使用字符串列输入python将年月转换为月
- python - 处理后恢复python列表的原始顺序?