gpt4 book ai didi

python - 猴子补丁 __del__ 到新功能

转载 作者:太空狗 更新时间:2023-10-29 18:31:51 24 4
gpt4 key购买 nike

为了特定的调试目的,我想包装任意对象的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com