如何将一个类的实例方法monkeypatch到另一个类的实例方法?

鉴于A类,我可以简单地添加一个实例方法

def a(self):
    pass

A.a = a

但是,如果我尝试添加另一个类B的instancemethod b,即A.b = B.b,则调用A().b()的尝试产生一个

TypeError: unbound method b() must be called with B instance as first argument (got nothing instead)

(而B().b()表现很好).确实存在差异

A.a -> <unbound method A.a>
A.b -> <unbound method B.b>  # should be A.b, not B.b

所以,

>如何解决这个问题?
>为什么会这样?它似乎不直观,但通常Guido有一些很好的理由……

奇怪的是,这在Python3中不再失败……

最佳答案
让我们:

class A(object): pass

class B(object):
    def b(self): 
        print 'self class: ' + self.__class__.__name__

当你这样做时:

A.b = B.b

您没有将函数附加到A,而是附加未绑定的方法.因此,python只将其添加为标准属性,并且不将其转换为A-unbounded方法.解决方案很简单,附加底层功能:

A.b = B.b.__func__

print A.b
    # print: <unbound method A.b>
a = A()
a.b()
    # print: self class: A

我不知道未绑定的方法和函数之间的区别(只有第一个包含第二个),而不是内部的所有工作方式.所以我无法解释它的原因.我的理解是方法对象(绑定与否)需要比函数更多的信息和功能,但它需要执行一个.

我同意自动执行此操作(更改未绑定方法的类)可能是一个不错的选择,但我可以找到不这样做的理由.令人惊讶的是,python 3与python 2不同.我想找出这个选择的原因.

转载注明原文:如何将一个类的实例方法monkeypatch到另一个类的实例方法? - 代码日志