python - 猴子补丁 __del__ 到新功能

标签 python monkeypatching

为了特定的调试目的,我想包装任意对象的 del 函数以执行额外的任务,例如将对象的最后一个值写入文件。

理想情况下我想写 猴子(x) 应该是x被删除的时候打印出x的最终值

现在我认为 del 是一个类方法。所以下面是一个开始:

class Test:
    def __str__(self):
        return "Test"

def p(self):
    print(str(self))

def monkey(x):
    x.__class__.__del__=p

a=Test()
monkey(a)
del a

但是,如果我只想对特定对象进行猴子操作,我想我需要动态地将它们的类重写为一个新类?!此外,无论如何我都需要这样做,因为我无法访问内置类型的 del

有人知道如何实现吗?

最佳答案

虽然特殊的“双下划线”方法,如 __del____str____repr__ 等可以在实例级别进行猴子修补,它们将被忽略,除非它们被直接调用(例如,如果你采用 Omnifarious 的答案:del a 不会打印任何东西,但是 a. __del__() 会)。

如果你仍然想在运行时对类 A单个实例 a 进行猴子修补,解决方案是动态创建一个类 A1 派生自 A,然后将 a 的类更改为新创建的 A1。是的,这是可能的,a 将表现得好像什么都没有改变——除了现在它包含了你的猴子修补方法。

这是一个基于我为另一个问题编写的通用函数的解决方案: Python method resolution mystery

def override(p, methods):
    oldType = type(p)
    newType = type(oldType.__name__ + "_Override", (oldType,), methods)
    p.__class__ = newType


class Test(object):
    def __str__(self):
        return "Test"

def p(self):
    print(str(self))

def monkey(x):
    override(x, {"__del__": p})

a=Test()
b=Test()
monkey(a)
print "Deleting a:"
del a
print "Deleting b:"
del b

关于python - 猴子补丁 __del__ 到新功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6010282/

相关文章:

python - 在 Python 中修补一个类的所有实例

python - 如何在Python中将 `self`传递给类似方法的对象

Python将numpy数组插入sqlite3数据库

Python:如何将类方法修改为其他类方法

python - 扭曲的服务器: monkey-patch file

python - Numpy-recarray,C#结构化数据

ruby-on-rails - 我如何猴子修补在 Bundler 中管理的 gem?

python - 在numpy中四舍五入到有效数字

python - 有没有更简洁的方法来使用 Django ORM 链接过滤器?

Python基础资料引用,相同引用列表