2017-09-29 1 views
2

Ich habe eine Liste von Namen wie folgt aus:Wie viele verschiedene Klassen von Listen mit Namen und Klassen in Python instanziiert

names = ['name_1', 'name_2', ..., 'name_n'] 

und eine Liste von Klassen (Namen von Klassen) wie folgt aus:

classes = ['class_1', 'class_2', ..., 'class_n'] 

kann ich jede Klasse wie folgt instanziiert:

name_1 = class_1() 

Wie kann ich alle Klassen mit Vornamen an auf instanziiert ce (vielleicht mit for-Schleife)?

+4

Es gibt in der Regel bessere Möglichkeiten, was Problem, das es zu lösen ist, dass Sie versuchen zu lösen. Dynamische Variablennamen sind fast nie die richtige Lösung. Gibt es einen Grund, warum Sie die Klassennamen als Strings haben, anstatt eine Liste der tatsächlichen Klassen? Gibt es einen Grund, warum Sie Variablennamen dynamisch erstellen müssen, anstatt die Instanzen in einem dict zu speichern? –

+0

Nachdem ich Ihre Kommentare zu den Antworten gelesen habe, vermute ich, dass dies wahrscheinlich ein [XY-Problem] ist (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Vielleicht möchten Sie eine ** neue ** Frage zum ** echten Problem ** stellen, nicht zu Ihrem ** Versuch **, es zu lösen. :) – MSeifert

+0

Ich versuche, diese Falle zu vermeiden. Ich versuche, alle Klassen von einem Modul sofort zu instanziieren. – GGG

Antwort

5

Warum speichern Sie den Namen der Klassen statt der Klassen selbst?

Sie könnten leicht die Klassen speichern, anstatt der Klassennamen:

classes = [class1, class2] 

Und dann verwenden

[cls() for cls in classes] 

die Instanzen zu erstellen.

Allerdings dynamische Variablennamen sind selten eine gute Idee, warum nicht in einem Diktat speichern?

d = {name: cls() for name, cls in zip(names, classes)} 

Und dann zugreifen d['name_1'] die Instanz für 'name_1' zu bekommen.

Die Wörterbuchlösung kann auch verwendet werden, wenn Sie die Liste der Klassennamen nicht umgehen können. Sie legen einfach ein Wörterbuch, das Mapping den Namen zu den tatsächlichen Klassen:

name_to_class = {'class_1': class_1, 'class_2': class_2, ...} 

d = {name: name_to_class[cls]() for name, cls in zip(names, classes)} 

Sie tun könnte es viel einfacher durch globals oder dergleichen verwendet wird, aber das ist eine wirklich schlechte Gewohnheit und würde alles (ein Sicherheitsrisiko) aus. Die Verwendung eigener Wörterbücher wird im Allgemeinen als "geeigneter" Weg betrachtet.

+0

Ich habe nur eine Liste von Klassennamen. Wie sollte ich die Klassen speichern? – GGG

+0

@GGG Ich aktualisierte die Antwort. – MSeifert

+0

Ich habe versucht, genau wie Sie beschrieben und bekam: NameError: Name 'Name_1' ist nicht definiert – GGG

0

Obwohl nicht empfohlen, was zu tun, nur zu Demonstrationszwecken hier gehen Sie

for index in range(len(names)): 
    name = names[index] 
    klass = classes[index] 

    vars()[name] = vars()[klass]() 
+0

Wenigstens hast du 'eval' nicht benutzt ... Trotzdem ist es noch unordentlich, mit' vars() ',' localhosts() 'und' globals() '... – MSeifert

+0

@MSeifert zu arbeiten Art von Haftungsausschluss am Anfang. Hab ich nicht? – hspandher

+0

Sie haben Recht. Ich erklärte gerade, was ich als "nicht empfehlenswert" empfinde. – MSeifert