如何创建实例名称列表,然后可以将其作为类实例

时间:2017-08-27 10:19:31

标签: python python-2.7 class instance

所以例如:

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

但它仍然没有成功。

知道我怎么能这样做吗?谢谢!

2 个答案:

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