As Python is a dynamic language it offers many possibilities how to manipulate object instances during runtime. We may for instance inject methods from another class, achieving similar results as if this instance has this calls as a mix-in super class. This approach could be useful to hack some existing libraries with extra functionality, in case we have to work with created instances.
This function will inject methods from mixin_class
into instance
assuring that method is properly bound to the instance.
import types def mixin(instance, mixin_class): """Dynamic mixin of methods into instance - works only for new style classes""" for name in mixin_class.__dict__: if name.startswith('__') and name.endswith('__') \ or not type(mixin_class.__dict__[name])==types.FunctionType: continue instance.__dict__[name]=mixin_class.__dict__[name].__get__(instance)
We use here python descriptor protocol (__get__
) to get bound method (same thing is actually happening when instance is getting a method from its super class). Alternatively a bound method could be created by this expression (python 2.7):
import types instance.x=types.MethodType(SomeClass.x.im_func, instance)