python 3: clase “plantilla” (función que devuelve una clase parametrizada)

Estoy tratando de crear una función que pasa un parámetro x y devuelve una nueva clase C C debe ser una subclase de una clase base fija A , con solo una adición: se agrega un cierto atributo de clase y se establece para que sea igual a x .

En otras palabras:

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

es fácil de hacer? ¿Hay algún problema que deba tener en cuenta?

En primer lugar, tenga en cuenta que el término “fábrica de clases” es algo obsoleto en Python. Se usa en lenguajes como C ++, para una función que devuelve una instancia de clase de tipo dynamic. Tiene un nombre porque se destaca en C ++; no es raro, pero es tan poco común que es útil darle un nombre al patrón. Sin embargo, en Python, esto se hace constantemente; es una operación tan básica que ya nadie se molesta por darle un nombre especial.

Además, tenga en cuenta que una fábrica de clases devuelve instancias de una clase, no una clase en sí. (Una vez más, eso se debe a que proviene de lenguajes como C ++, que no tienen el concepto de devolver solo objetos de clase). Sin embargo, usted dijo que desea devolver “una nueva clase”, no una nueva instancia de una clase.

Es trivial crear una clase local y devolverla:

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

La función de tipo tiene una versión de 3 argumentos que construye dinámicamente una nueva clase. Pase el nombre , las bases y un dictado que contiene los atributos y métodos de la clase.

En tu caso:

 def class_factory(x): return type("C", (A,), {"p": x}) 

Obviamente, puede establecer dinámicamente el nombre de la clase, ” C “, pero tenga en cuenta que para hacer que la clase sea de acceso público, también debe asignar el resultado de la función a una variable. Puede hacerlo dinámicamente utilizando globals()["C"] = ... , o asigne las clases a un diccionario, lo que sea.