Creating new classes on the fly

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


On Tue, 5 Oct 2004 13:04:39 -0800, Troy Melhase <troy.melhase at gmail.com> 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
blog: http://rascunhosrotos.blogspot.com
blog: http://pythonnotes.blogspot.com
mail: carribeiro at gmail.com
mail: carribeiro at yahoo.com



More information about the Python-list mailing list