如何修复有助于根据食谱准备菜肴的功能?

时间:2018-09-01 00:04:58

标签: python

我正在尝试执行一个功能,只要用户库存中有足够的食材,便可以准备菜肴。但是,我不确定如何创建此功能。

到目前为止,我有这个:

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

1 个答案:

答案 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的外观,以便任何人都能进一步提供帮助。