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