Pregunta ¿Cómo establecer los nombres de las clases de forma dinámica?


Tengo una función que crea clases derivadas de sus argumentos:

def factory(BaseClass) :
    class NewClass(BaseClass) : pass
    return NewClass

Ahora, cuando lo uso para crear nuevas clases, todas las clases tienen el mismo nombre, y las instancias parecen tener el mismo tipo:

NewA = factory(ClassA)
NewB = factory(ClassB)
print type(NewA()) # <class __main__.NewClass>
print type(NewB()) # <class __main__.NewClass>

Es la solución adecuada para configurar manualmente el __name__ ¿atributo?

NewA.__name__ = 'NewA'
print type(NewA()) # <class __main__.NewA>

¿Hay otras cosas que debería establecer mientras estoy en eso?


32
2018-03-18 13:39


origen


Respuestas:


Sí, estableciendo __name__ es lo correcto para hacer; no necesita configurar nada para ajustar el nombre de la clase.

Por ejemplo:

def factory(BaseClass) :
    class NewClass(BaseClass): pass
    NewClass.__name__ = "factory_%s" % BaseClass.__name__
    return NewClass

type es el incorrecto cosa para usar aquí. No le permite definir clases con la sintaxis de clase normal de Python, sino que le permite configurar cada atributo de clase manualmente. Se usa para crear clases a mano, ej. si tiene una matriz de clases base y quiere crear una clase que la use (lo que no puede hacer con la sintaxis de clase de Python). No lo use aquí.


37
2018-03-18 14:43



Echa un vistazo usando el type() funcionar con tres argumentos El siguiente código crea una nueva clase "NewA", con object como el tipo base y sin atributos iniciales.

>>> type('NewA', (object,), {})
<class '__main__.NewA'>

10
2018-03-18 13:48