所以例如:
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']
但它仍然没有成功。
知道我怎么能这样做吗?谢谢!
答案 0 :(得分: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
命名,它会覆盖内置类型。
答案 1 :(得分: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)]