2010-08-10 75 views
26

Tengo una lista de nombres de clases y quiero crear sus instancias dinámicamente. por ejemplo:cómo crear dinámicamente una instancia de una clase en python?

names=[ 
'foo.baa.a', 
'foo.daa.c', 
'foo.AA', 
.... 
] 

def save(cName, argument): 
aa = create_instance(cName) # how to do it? 
aa.save(argument) 

save(random_from(names), arg) 

¿Cómo crear dinámicamente esas instancias en Python? ¡Gracias!

Respuesta

18

Esto se refiere a menudo como la reflexión o, a veces introspección. Echa un vistazo a una serie de preguntas similares que tienen una respuesta para lo que está tratando de hacer:

Does Python Have An Equivalent to Java Class forname

Can You Use a String to Instantiate a Class in Python

+1

Algunos de esos ejemplos usan '__import__', para el código más nuevo puede cambiar a' importlib' http://docs.python.org/dev/library/importlib.html. (py> = 2.7 |> = 3.1) – SiggyF

+1

No use enlaces, por favor proporcione una descripción real. – shadowbq

3

Puede usar la instrucción python incorporada eval() para crear instancias de sus clases. De esta manera:

aa = eval(cName)() 
+4

No utilice eval ya que es susceptible a problemas de seguridad. – Necrolyte2

+1

y ¿cómo es susceptible? –

4

A menudo se puede evitar la parte de procesamiento de cadena de este completo.

import foo.baa 
import foo.AA 
import foo 

classes = [ foo.baa.a, foo.daa.c, foo.AA ] 

def save(theClass, argument): 
    aa = theClass() 
    aa.save(argument) 

save(random.choice(classes), arg) 

Tenga en cuenta que no usamos una cadena de representación del nombre de la clase.

En Python, puede usar la clase en sí misma.

+0

Supongamos que la matriz proviene de la base de datos. Entonces esta solución no ayuda. –

27

Asumiendo que ya ha importado las clases correspondientes utilizando algo así como

from [app].models import * 

todo lo que necesita hacer es

klass = globals()["class_name"] 
instance = klass() 
Cuestiones relacionadas