python 3: class "template" (function that returns a parameterized class)

max picture max · Feb 1, 2011 · Viewed 12k times · Source

I am trying to create a function that is passed a parameter x and returns a new class C. C should be a subclass of a fixed base class A, with only one addition: a certain class attribute is added and is set to equal x.

In other words:

class C(A):
  C.p = x # x is the parameter passed to the factory function

Is this easy to do? Are there any issues I should be aware of?

Answer

Glenn Maynard picture Glenn Maynard · Feb 1, 2011

First off, note that the term "class factory" is somewhat obsolete in Python. It's used in languages like C++, for a function that returns a dynamically-typed instance of a class. It has a name because it stands out in C++; it's not rare, but it's uncommon enough that it's useful to give the pattern a name. In Python, however, this is done constantly--it's such a basic operation that nobody bothers giving it a special name anymore.

Also, note that a class factory returns instances of a class--not a class itself. (Again, that's because it's from languages like C++, which have no concept of returning a class--only objects.) However, you said you want to return "a new class", not a new instance of a class.

It's trivial to create a local class and return it:

def make_class(x):
    class C(A):
        p = x
    return C