2017-08-27 32 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

相關問題