我有一大堆代码可以自动执行猴子修补,缓存函数的im_func引用,然后在将原始文件的im_func作为._unmonkeyed属性附加时替换该函数,如下所示:
class MonkeyPatch(object):
'''A callable object to implement the monkey patch. Stores the previous version in
attribute _unmonkeyed and new version in _monkeyed.'''
def __init__(self,source,target,attr):
self._monkeyPatchSource=source
self._monkeyPatchTarget=target
self._monkeyPatchAttr=attr
self._monkeyed=getattr(source,attr).im_func
self._unmonkeyed=getattr(target,attr,None)
setattr(target,attr,self)
###a few more methods here
def __get__(self,inst,cls=None): #(self,*args,**kwds):
tmp=lambda *args,**kwds: self._monkeyed(inst,*args,**kwds)
tmp._unmonkeyed=lambda *args,**kwds: self._unmonkeyed(inst,*args,**kwds)
return tmp
我没有太多的Pythonista,所以我确定这有一千个理由这是一种愚蠢的做事方式,但它对我有用。现在我发现自己处在一个我想修补课程的地方。 __new__
方法在调用现有__new__
之前添加一些逻辑。 __new__
没有im_func
属性,这可能表示还有其他方法没有。
对于没有im_func的方法,有没有办法以一般方式完成相同的工作(最好不必保留特殊情况列表)?
子类化不是我想要的行为,因为我想将新代码注入现有的类层次结构中。这不是生产代码,所以我不太担心添加一些蓝线的后果。