2017-08-27 28 views
0

这样:我怎样才能使实例名称的列表,然后可以例如做成一个类的实例

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)]) 
从这个

现在我要土豆烧牛肉和炸肉排,成为一个实例。然而,问题在于炖牛肉和炸肉排都是未定义的变量,所以当我尝试列表时会失败。我尝试将名称变为字符串:

list = ['schnitzel', 'goulash'] 

但它仍然无法工作。

任何想法我可以做到这一点?谢谢!

回答

1

这里有两个解决方案,其中第一个我可能建议。

我想你可能想改变你班级的结构来添加某种id,这样你就可以区分了。

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

然后改变你的list成字符串列表:lst = ['schnitzel', 'goulash']

现在通过你的列表进行迭代并创建每种食物名称的对象:

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

请注意,我*ingredients解压成分内容为args。这样,如果我做了args[0]我会得到('chicken', 2)

现在,你有你的对象列表:

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

第二种方法是使用字典。改变你的数据表的结构,像这样:

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

然后,你可以这样做:

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

但后来留给你的只有对象的食物清单,并没有办法区分哪些食物是什么。你可能list_of_foods.append([k, Recipe(*v)]),但我认为这会有点混乱。这就是为什么我实现了Recipe.name属性。


好提示:不要将其命名列表list,它将覆盖内置的类型。

0

使用*操作解压参数:

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

您也可能希望将名字传递给初始化。这里是我的建议(重构后):

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

我不认为这是OP要求... – TerryA

+0

因为他的问题与他的名单有关:“问题是炖牛肉和炸肉排都是未定义的变量,所以当我尝试列表时失败” – TerryA

相关问题