2011-03-18 13 views
30

tengo una función que crea clases derivadas de sus argumentos:¿Cómo establecer los nombres de clase dinámicamente?

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

Ahora cuando lo uso para crear nuevas clases, las clases son todos el mismo nombre, y los casos que parezca que tienen 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 atributo __name__?

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

¿Hay alguna otra cosa que debería establecer mientras estoy en ello?

Respuesta

34

Sí, la configuración __name__ es lo correcto; 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 mal cosa a utilizar 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í.

7

Consulte usando la función type() con tres argumentos. El siguiente código crea una nueva clase "NewA", con object como tipo de base y sin atributos iniciales.

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

Parece un poco torpe si la definición de clase en NewClass es muy larga. Tendría que acumular todos los métodos en un diccionario (supongo que la cadena de documentación también va allí, bajo la tecla ''__doc __''). – kiyo

+0

¿Qué sucede si los métodos en NewClass deben referirse dinámicamente a los métodos de BaseClass? – kiyo

+0

'type' es para cosas como crear clases con listas base variables; es completamente la herramienta incorrecta para esto. –

Cuestiones relacionadas