如何将 class 实例中的无界方法复制为 Python 中的有界方法

How to copy non-bounded method as bounded in class instance in Python

我有一个代码,我想在 运行 时间内 'steal' 其他 class 的方法。 (这是一个小游戏,我想让机器人按需改变策略)。

示例:

class X(object):
    def foo(self):
        return 1


class Y(object):
    def foo(self):
        return 2

我想 'copy' Y.foo 进入 X class:

的实例
x.foo = Y.foo
x.foo()  # unbound method
x.foo = types.MethodType(Y.foo, x)
x.foo()  # TypeError: unbound method foo() must be called with Y instance as first argument (got X instance instead
tmp=x.foo.__self__
x.foo=Y.foo
x.foo.__self__ = tmp  # readonly attribute
x.foo.__func__ = Y.bar.__func__ # readonly attribute

有没有什么方法可以在 运行 时间内将函数从一个 class 复制到另一个,而不需要:

  1. 继承(应该在实例化的方法内部完成class)
  2. x.foo
  3. 内部调用 Y.bar

在Python 2、在class上访问一个方法returns一个未绑定的方法。使用 __func__ 属性简单地展开该方法以获得原始函数:

x.foo = types.MethodType(Y.foo.__func__, x)

您可以告诉该函数使用 descriptor protocol:

进行绑定
x.foo = Y.foo.__func__.__get__(x)

演示:

>>> class X(object):
...     def foo(self):
...         return 1
...
>>> class Y(object):
...     def foo(self):
...         return 2
...
>>> x = X()
>>> Y.foo
<unbound method Y.foo>
>>> Y.foo.__func__
<function foo at 0x1006d1b18>
>>> Y.foo.__func__.__get__(x)
<bound method ?.foo of <__main__.X object at 0x1006e84d0>>
>>> x.foo = Y.foo.__func__.__get__(x)
>>> x.foo()
2