相当于__new__的im_func?

时间:2014-12-19 23:53:19

标签: python python-2.7 monkeypatching

我有一大堆代码可以自动执行猴子修补,缓存函数的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的方法,有没有办法以一般方式完成相同的工作(最好不必保留特殊情况列表)?

子类化不是我想要的行为,因为我想将新代码注入现有的类层次结构中。这不是生产代码,所以我不太担心添加一些蓝线的后果。

0 个答案:

没有答案