how to dynamically instantiate an object inheriting from several classes?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Nov 22 03:02:12 CET 2008


On Fri, 21 Nov 2008 15:11:20 -0700, Joe Strout wrote:

> I have a function that takes a reference to a class, 

Hmmm... how do you do that from Python code? The simplest way I can think 
of is to extract the name of the class, and then pass the name as a 
reference to the class, and hope it hasn't been renamed in the meantime:

def foo(cls_name, item_args):
    # Won't necessarily work for nested scopes.
    cls = globals()[cls_name]
    item = cls(**itemArgs)
    return item

instance = foo(Myclass.__name__, {'a':1})
        
Seems awfully complicated. If I were you, I'd forget the extra layer of 
indirection and just pass the class itself, rather than trying to 
generate some sort of reference to it. Let the Python virtual machine 
worry about what is the most efficient mechanism to use behind the scenes.


[...]
> But now I want to generalize this to handle a set of mix-in classes.
> Normally you use mixins by creating a class that derives from two or
> more other classes, and then instantiate that custom class.  But in my
> situation, I don't know ahead of time which mixins might be used and in
> what combination.  So I'd like to take a list of class references, and
> instantiate an object that derives from all of them, dynamically.
> 
> Is this possible?  If so, how?

It sounds like you need to generate a new class on the fly. Here's one 
way:

# untested
def foo(cls, item_args, mixins=None):
    superclasses = [cls] + (mixins or [])
    class MixedClass(*superclasses):
        pass
    item = MixedClass(**itemArgs)
    return item

instance = foo(MyClass, {'a':1}, [Aclass, Bclass, Cclass])


-- 
Steven



More information about the Python-list mailing list