猴子补丁__del__到新功能

| 为了特定的调试目的,我想包装任意对象的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
不会打印任何东西,but5ѭ会打印出来。 如果仍然想在运行时猴子修补类
A
的单个实例
a
,解决方案是动态创建派生自
A
的类
A1
,然后将
a
的类更改为新创建的
A1
。是的,这是可能的,并且ѭ6behave的行为就好像什么都没有改变一样,只是现在它包括了猴子修补方法。 这是基于我为另一个问题编写的泛型函数的解决方案: Python方法解析之谜
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
    
您还可以从某些基类继承并覆盖
__del__
方法(然后,您唯一需要做的就是在构造对象时覆盖类)。 或者您可以使用
super
内置方法。     
“ 4”从名称空间中删除名称“ a”,但不会删除该名称引用的对象。看到这个:
>>> x = 7
>>> y = x
>>> del x
>>> print y
7
同样,
some_object.__del__
也不保证完全被调用。 另外,我已经在这里(德语)回答了您的问题。     
编辑:这实际上是行不通的,我主要是在这里警告其他人。 您可以猴子修补单个对象。
self
不会传递给您用这种方式修补的函数,但是
functools.partial
可以轻松地对其进行补救。 例:
def monkey_class(x):
    x.__class__.__del__ = p

def monkey_object(x):
    x.__del__ = functools.partial(p, x)
    

要回复问题请先登录注册