2017-08-27 1 views
0

so zum Beispiel:Wie kann ich eine Liste der Instanznamen machen, die dann in eine Klasseninstanz gemacht werden kann

class Recipe: 
    def __init__(self, *args): 
    #does something with args 

list = [schnitzel, goulash] #list of instance names 
datalist =[[['chicken',2],['breadcrumbs', 100],['flour', 100]],[['beef', 500],['paprika powder', 100]] #these are the args which are in the same index as as its name in list. 

for i in list: 
    i = Recipe(datalist[list.index(i)]) 

nun von diesem Ich möchte Gulasch und Schnitzel eine Instanz werden. Das Problem ist jedoch, dass Gulasch und Schnitzel beide nicht definierte Variablen sind, so dass es fehlschlägt, wenn ich versuche, eine Liste zu erstellen. Ich habe versucht, die Namen in Strings zu machen:

list = ['schnitzel', 'goulash'] 

aber es funktioniert immer noch nicht.

Irgendeine Idee, wie ich das tun könnte? Vielen Dank!

Antwort

1

Es gibt zwei Lösungen hier, von denen die erste ich wahrscheinlich empfehle.

Ich denke, Sie möchten vielleicht die Struktur Ihrer Klasse ändern, um eine Art id hinzuzufügen, so dass Sie in der Lage sein können, zu unterscheiden.

class Recipe: 
    def __init__(self, name, *args): 
     self.name = name 
     #does something with args 

Dann wird Ihr list in eine Liste von Strings ändern: lst = ['schnitzel', 'goulash'].

iterieren nun durch die Liste und erstellen Sie Objekte mit jedem Nahrungsmittelnamen:

list_of_foods = [] 
for food, ingredients in zip(lst, datalist): 
    list_of_foods.append(Recipe(food, *ingredients)) 

Bitte beachte, dass ich *ingredients-entpacken den Inhalt der Zutaten in args tun. Auf diese Weise würde ich args[0]('chicken', 2) bekommen.

Jetzt haben Sie eine Liste Ihrer Objekte:

for food_obj in list_of_foods: 
    print(food_obj.name) # This will print "schnitzel" then "goulash" 

Die zweite Methode Wörterbücher verwendet. Ändern Sie die Struktur Ihrer Datenliste wie folgt:

datalist = {"schnitzel":[['chicken',2],['breadcrumbs', 100],['flour', 100]], 
"goulash":[['beef', 500],['paprika powder', 100]]} 

Dann können Sie tun:

list_of_foods = [] 
for k, v in datalist.items(): 
    list_of_foods.append(Recipe(*v)) 

Aber dann sind Sie mit einer Liste von Lebensmitteln links mit nur Objekte und es gibt keine Möglichkeit zu unterscheiden, was Essen ist was. Sie könnte tun list_of_foods.append([k, Recipe(*v)]), aber ich denke, das wäre ein wenig unordentlich. Deshalb habe ich ein Recipe.name Attribut implementiert.


Guter Tipp: Sie nennen keine Liste list, wird es die eingebauten Typ außer Kraft setzen.

0

Verwenden * Operator Argumente auspacken:

Recipe(*datalist[list.index(i)]) 

Sie können auch den Namen der initializer übergeben wollen. Hier ist mein Vorschlag (nach Refactoring):

class Recipe: 
    def __init__(self, name, *args): 
     print(name, args) 

dishes = ['schnitzel', 'goulash'] 
ingridients = [[['chicken', 2], ['breadcrumbs', 100], ['flour', 100]], [['beef', 500], ['paprika powder', 100]]] 
recipes = [Recipe(name, *args) for name, args in zip(dishes, ingridients)] 
+1

Ich glaube nicht, dass das ist, was OP verlangt ... – TerryA

+0

Weil sein Problem mit seiner Liste zu tun hat: "Das Problem ist, dass Gulasch und Schnitzel beide undefinierte Variablen sind, also versagt es, wenn ich versuche Liste zu machen" – TerryA

Verwandte Themen