在 Python 中能做到拦截某个方法的执行吗,比如对 logger 添加一些额外的操作

2021-07-21 15:55:06 +08:00
 zxCoder
710 次点击
所在节点    问与答
8 条回复
pabupa
2021-07-21 15:56:35 +08:00
装饰器就是干这个的。
zxCoder
2021-07-21 16:05:12 +08:00
@pabupa 这个需要对代码进行比较多的修改吧 有没有直接根据方法名称就可以做到的
pabupa
2021-07-21 16:28:55 +08:00
@zxCoder 靠意念,通过念咒语实现吗?那我还在练习……
vicalloy
2021-07-21 16:49:20 +08:00
这个需求挺常见的,俗称 monkey patch 。
比如

class Hi:
....def hi(self):
........print('Hi')

Hi().hi()

Hi.old_hi = Hi.hi

def new_hi(self):
....print('before Hi')
....self.old_hi()

Hi.hi = new_hi
Hi().hi()
johnsona
2021-07-21 18:12:54 +08:00
logger ?那当然是继承下来改方法
johnsona
2021-07-21 18:13:26 +08:00
装饰器就是可以在不改代码的情况下 给函数添加功能
zxCoder
2021-07-21 18:51:08 +08:00
@johnsona 但还是需要替换原本的 logger 函数,因为没办法全局替换,比较麻烦
johnsona
2021-07-21 22:20:20 +08:00
@zxCoder 你是不是想改变一些开源库的 logger 行为? 可以通过移除和添加自己的 handler 好像 来改变 logger 的行为 有一个 root logger

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/790861

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX