Creating new classes on the fly

Carlos Ribeiro carribeiro at
Tue Oct 5 23:59:03 CEST 2004

On Tue, 5 Oct 2004 13:04:39 -0800, Troy Melhase <troy.melhase at> wrote:
> I've had the same need recently, and I've found that coding the class
> as part of a closure is readable (untested code):
> def my_custom_class():
>     some_param = lookup_param() # now part of the lexical scope, can be mutable
>     class MyCustomClass:
>         default_param = some_param
>     return MyCustomClass
> CustomizedClass1 = my_custom_class()
> CustomizedClass2 = my_custom_class()
> instances_of_one = [CustomizedClass1(), CustomizedClass1(), ]
> instances_of_two = [CustomizedClass2(), CustomizedClass2(), ]
> Good luck,
> troy
I've done exactly that for one of my classes, for the first test.
However, I really felt that some better way should exist out of
creating an enclosing function for every one of the classes.

I've right now finished a small "class decorator" -- a function that
takes a class and a bunch of named parameters, and that returns a new
function that acts as a class constructor of sorts. It's something
like this:

next_id = itertools.count().next

def InheritedClassFactory(klass):
    def ClassDecorator(*args, **kw):
        newname = klass.__name__ + '_' + str(next_id())
        newklass = type(newname, (klass, ), kw)
        return newklass
    return ClassDecorator

MyClass = InheritedClassFactory(MyClass)

It's interesting that this is one situation where a metaclass isn't of
much help, while a class decorator does the trick. Of course, I'm
assuming that I really need to do it, but other solutions (not
involving the creation of new classes) may be better (but I'm not
aware of any such options).

Carlos Ribeiro
Consultoria em Projetos
mail: carribeiro at
mail: carribeiro at

More information about the Python-list mailing list