2010-08-10 24 views
26

Ich habe eine Liste von Klassennamen und möchte ihre Instanzen dynamisch erstellen. Beispiel:Wie erstellt man dynamisch eine Instanz einer Klasse in 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) 

Wie Sie diese Instanzen in Python dynamisch erstellen? Vielen Dank!

Antwort

18

Dies wird oft als Reflexion oder manchmal Selbstbeobachtung. Überprüfen Sie eine ähnliche Fragen aus, die eine Antwort haben für das, was Sie zu tun versuchen:

Does Python Have An Equivalent to Java Class forname

Can You Use a String to Instantiate a Class in Python

+1

Einige dieser Beispiele verwenden '__import__', für neueren Code können Sie zu' importlib' http://docs.python.org/dev/library/importlib.html wechseln. (py> = 2.7 |> = 3.1) – SiggyF

+1

Keine Links verwenden, bitte geben Sie eine echte Beschreibung an. – shadowbq

3

Sie können die integrierte Python-Anweisung eval() verwenden, um Ihre Klassen zu instanziieren. So:

aa = eval(cName)() 
+4

nicht eval Verwenden Sie, wie es Sicherheitsprobleme anfällig ist. – Necrolyte2

+1

und wie ist es anfällig? –

4

Sie können oft die String-Verarbeitung Teil davon ganz vermeiden.

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) 

Beachten Sie, dass wir keine String-Repräsentation des Namens der Klasse verwenden.

In Python können Sie einfach die Klasse selbst verwenden.

+0

Angenommen, das Array stammt aus der Datenbank. Also diese Lösung hilft nicht. –

27

Angenommen, Sie haben bereits die entsprechenden Klassen importiert etwas mit wie

from [app].models import * 

alle müssen Sie tun, ist

klass = globals()["class_name"] 
instance = klass() 
Verwandte Themen