我正在尝试执行一个功能,只要用户库存中有足够的食材,便可以准备菜肴。但是,我不确定如何创建此功能。
到目前为止,我有这个:
def CanPrepareDish(recipe_name):
recipe = cookbook.getRecipe(recipe_name)
for ingred in recipe:
if ingred not in iinventory:
return False
if iinventory[ingred] < recipe[ingred]:
return False
return True
def preparedish(recipe_name):
if not CanPrepareDish(recipe_name):
print("Not enough ingredients")
else:
dish = cookbook.getRecipe(recipe_name)
recipe = dish.getName()
for recipe in cookbook.allRecipes():
iinventory[ingred] -= recipe[ingred]
if recipe_name == recipe.getName():
iinventory[recipe_name] += 1
else:
iinventory[recipe_name] = 1
print("Dish prepared")
class Cookbook:
def __init__(self):
self.Cooklist=[]
def addRecipe(self,Recipe):
self.Cooklist.append(Recipe)
def getRecipe(self,recipe_name):
for recipe in self.Cooklist:
if recipe_name == recipe.getName():
return recipe
def allRecipes(self):
for Recipe in self.Cooklist:
return self.Cooklist
cookbook=Cookbook()
class Iinventory:
def __init__(self):
self.apple_num=0
self.beet_num=0
self.carrot_num=0
def getApples(self):
return int(self.apple_num)
def getBeets(self):
return int(self.beet_num)
def getCarrots(self):
return int(self.carrot_num)
iinventory=Iinventory()
我要使用CanPrepareDish(recipe_name)
检查是否有足够的食材使他们可以实际准备菜肴,因此如果他们preparedish
不能打印,则说明食材不足。但是,由于它是一个对象,所以我无法遍历该食谱,那么我将如何遍历该食谱以查看是否有足够的配料?
对于preparedish
,我不知道该如何处理。因此,应该检查CanPrepareDish
是否有足够的配料,如果可以的话,则准备菜并从iinventory
(也是一个对象)中取出使用的配料。
已创建的配方对象/类。
class Recipe:
def __init__(self,name,apple_num,beet_num,carrot_num):
self.name=str(name)
self.apple_num=int(apple_num)
self.beet_num=int(beet_num)
self.carrot_num=int(carrot_num)
def getName(self):
return self.name
def getApples(self):
return self.apple_num
def getBeets(self):
return self.beet_num
def getCarrots(self):
return self.carrot_num
答案 0 :(得分:0)
原始答案在下面,此顶部是更新以反映新信息。首先,请参见下面的代码转储:
class Ingredients:
def __init__(self):
self.ingredients = {"apples": 0, "beets": 0, "carrots": 0}
def getApples(self):
return self.ingredients["apples"]
def getBeets(self):
return self.ingredients["beets"]
def getCarrots(self):
return self.ingredients["carrots"]
class Iinventory(Ingredients):
def __init__(self):
Ingredients.__init__(self)
class Recipe(Ingredients):
def __init__(self, name, apple_num, beet_num, carrot_num):
Ingredients.__init__(self)
self.name = name
self.ingredients["apples"] = apple_num
self.ingredients["beets"] = beet_num
self.ingredients["carrots"] = carrot_num
def getName(self):
return self.name
def CanPrepareDish(recipe_name, inventory):
recipe = cookbook.getRecipe(recipe_name)
for ingred in recipe.ingredients.keys():
if ingred not in inventory.ingredients.keys():
return False
if inventory.ingredients[ingred] < recipe.ingredients[ingred]:
return False
return True
def preparedish(recipe_name, inventory):
if not CanPrepareDish(recipe_name, inventory):
print("Not enough ingredients")
else:
dish = cookbook.getRecipe(recipe_name)
recipe = dish.getName()
for recipe in cookbook.allRecipes():
inventory[ingred] -= recipe[ingred]
if recipe_name == recipe.getName():
inventory[recipe_name] += 1
else:
inventory[recipe_name] = 1
print("Dish prepared")
class Cookbook:
def __init__(self):
self.Cooklist = []
def addRecipe(self, Recipe):
self.Cooklist.append(Recipe)
def getRecipe(self, recipe_name):
for recipe in self.Cooklist:
if recipe_name == recipe.getName():
return recipe
def allRecipes(self):
for _ in self.Cooklist:
return self.Cooklist
cookbook = Cookbook()
r = Recipe("food", 1, 2, 3)
cookbook.addRecipe(r)
iinventory = Iinventory()
iinventory.ingredients["apples"] = 5
iinventory.ingredients["beets"] = 5
iinventory.ingredients["carrots"] = 5
print(iinventory.getApples())
print(r.getBeets())
if CanPrepareDish("food", iinventory):
print("Can make recipe")
else:
print("Nope")
在我解释这些变化之前,我只想指出几个小问题。 1.准备功能现在无法使用,因为它使用了一个来自该功能外部的 ingred 变量-我假设您可以控制它。 2. 如果没有出现在stock.ingredients.keys()部分中,将永远不会触发,因为目前事物的结构方式,Iinventory和Recipe类都将始终具有定义的所有成分。
因此,请解释以上内容。首先,我注意到您的Iinventory和Recipe类重复了很多相同的东西,因此我将它们都作为顶级Ingredients类的子类。实际上,目前的存货只不过是新名称的“成分”。食谱还有更多内容,但基本上,它只是设置与以前相同的内容。严格来说,您实际上不需要在Ingredients的初始位置定义全零字典,但我个人认为它更整洁。
要对不同类型的配料进行迭代,只需调用.keys() 每个对象的配料成员。
此外,由于某些原因,我制作了CanPrepareDish和prepareish函数将清单用作另一个参数。这只是意味着我可以在顶部定义这些内容,然后在底部使用它们,是否保持这种方式完全取决于您。
我在底部包括了一些用于测试实现的代码。如果您注释了prepareish()函数,则应该可以看到它们全部正常工作。
您是否需要进一步澄清?
正如@Denziloe所指出的那样,当前您有三个单独的变量,通常,您无法遍历单独的变量。
根据您在CanPrepareDish中所拥有的内容,我认为您最好的方法可能是使用字典来存储成分。请注意,由于我不确定我的清单是什么样子,所以不能确定这就是您想要的。
因此,首先,将Recipe类更改为使用字典而不是单个变量:
class Recipe:
def __init__(self, name, apple_num, beet_num, carrot_num):
self.name = str(name)
self.ingredientsList = {}
self.ingredientsList["apples"] = apple_num
self.ingredientsList["beets"] = beet_num
self.ingredientsList["carrots"] = carrot_num
def getName(self):
return self.name
def getApples(self):
return self.ingredientsList["apples"]
def getBeets(self):
return self.ingredientsList["beets"]
def getCarrots(self):
return self.ingredientsList["carrots"]
,然后将CanPrepareDish更改为:
def CanPrepareDish(recipe_name):
recipe = cookbook.getRecipe(recipe_name)
for ingred in recipe.ingredientsList.keys():
if ingred not in iinventory:
return False
if iinventory[ingred] < recipe.ingredientsList[ingred]:
return False
return True
CanPrepareDish函数的唯一更改是将for循环更改为使用配方.ingredientsList.keys()。
尝试一下,看看是否有帮助。否则,您可能不得不再次编辑问题以向我们展示iinventory的外观,以便任何人都能进一步提供帮助。