2017-08-27 1 views
0

donc par exemple:Comment puis-je faire une liste de noms d'instance qui peut ensuite être transformé en une instance de classe

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)]) 

maintenant de ce que je veux goulasch et escalope de devenir une instance. Cependant, le problème est que goulash et schnitzel sont des variables indéfinies, donc ça échoue quand j'essaye de faire une liste. J'ai essayé de faire les noms dans les chaînes:

list = ['schnitzel', 'goulash'] 

mais cela ne fonctionne toujours pas.

Une idée de comment je pourrais faire cela? Merci!

Répondre

1

Il y a deux solutions ici, la première que je recommande probablement.

Je pense que vous voudrez peut-être changer la structure de votre classe pour ajouter une sorte de id, de sorte que vous puissiez vous différencier.

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

changer ensuite votre list dans une liste de chaînes: lst = ['schnitzel', 'goulash'].

maintenant itérer votre liste et créer des objets avec chaque nom alimentaire:

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

Notez que je ne *ingredients-déballer le contenu des ingrédients dans args. De cette façon, si je l'ai fait args[0] j'obtiendrais ('chicken', 2).

Maintenant, vous avez une liste de vos objets:

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

La deuxième méthode utilise des dictionnaires. Changer la structure de votre liste de données comme ceci:

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

Ensuite, vous pouvez faire:

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

Mais alors vous vous retrouvez avec une liste d'aliments avec des objets juste et il n'y a aucun moyen de différencier ce la nourriture est quoi. Vous pourrait faire list_of_foods.append([k, Recipe(*v)]), mais je pense que ce serait un peu en désordre. C'est pourquoi j'ai implémenté un attribut Recipe.name.


bon conseil: Ne nommez pas une liste list, il remplace le type intégré.

0

Utilisez opérateur * pour décompresser arguments:

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

Vous pouvez également vouloir transmettre le nom à l'initialiseur. Voici ma suggestion (après 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

Je ne pense pas que c'est ce que l'OP demande ... – TerryA

+0

Parce que son problème a à voir avec sa liste: "le problème est que goulash et schnitzel sont des variables indéfinies donc ça échoue quand j'essaye de faire une liste" – TerryA