Search code examples
pythonpython-3.xclass-designfactory-pattern

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


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?


Solution

  • 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