如何将 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 复制到另一个,而不需要:
- 继承(应该在实例化的方法内部完成class)
- 从
x.foo
内部调用 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
我有一个代码,我想在 运行 时间内 '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 复制到另一个,而不需要:
- 继承(应该在实例化的方法内部完成class)
- 从
x.foo
内部调用
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