我正在尝试在类上进行有限形式的动态混合,从第三方库类中获取方法并将它们绑定到我的类.但我尝试过的任何东西都没有正常工作.我在其他地方看到的所有示例都将一个未绑定的函数绑定到一个类,但在我的情况下,我需要将已绑定的方法绑定到另一个类.
我一直在使用的一些示例代码,包括我失败的尝试:
import types
import traceback
class Class1(object):
output = 'class1'
def method(self):
print self.output
class Class2(object):
output = 'class2'
try:
Class2.method = types.MethodType( Class1.method, None, Class2 )
class2 = Class2()
class2.method()
except:
traceback.print_exc() # TypeError: unbound method method() must be called with Class1 instance as first argument (got Class2 instance instead)
try:
class1 = Class1()
class2 = Class2()
class2.method = types.MethodType( class1.method, class2, Class2 )
class2.method()
except:
traceback.print_exc() # TypeError: method() takes exactly 1 argument (2 given)
class1 = Class1()
class2 = Class2()
class2.method = class1.method.__get__( class2, Class2 )
class2.method() # outputs 'class1' not 'class2'
Run Code Online (Sandbox Code Playgroud)
这可能吗?难道我做错了什么?还有另一种我没见过的技术吗?
通过修改YourClass.__bases__以下内容将其动态添加为父类:
>>> class Base: pass
>>> class Foo(Base): pass
>>> class Bar(Base): attr = True
>>> Foo.__bases__ = (Bar,) + Foo.__bases__
>>> Foo.attr
True
Run Code Online (Sandbox Code Playgroud)
或者,获取绑定的方法对象并提取原始函数,然后将其作为原始类的属性附加:
YourClass.method = OtherClass.bound_method.im_func
Run Code Online (Sandbox Code Playgroud)
编辑:你__bases__不修改__mro__.哎呀.