0

我正在开发一个基于文本的小游戏,但我在创建这个列表时遇到了麻烦Food,我想把我所有的Food(汉堡或热狗)都放在listOfFood. 在我的示例中,我只包括了两个,但它们都是以食物为基础的。

稍后我将遍历我listOfFood的做某事。我抽象了我的代码来提问(因为它有太多行,而其他信息与它无关)。

class Food():
    def __init__(self):
        self.name = 'Food'

class HotDog(Food):
    def __init__(self):
        Food.__init__(self)

class Burger(Food):
    def __init__(self):
        Food.__init__(self)

def createFoodList(myOrders):
    # A list that contain all the food (either Burger or Hotdog)
    listOfFood = []

    # Depend what is the type of the food, create that many food object
    # and then append it to the list of food
    if myOrders[0][0] == 'HotDog':
        for number in myOrder[0][1]:
            listOfFood.append(HotDot())
    if myOrders[0][1] == 'Burger':
        for number in myOrder[0][1]:
            listOfFood.append(Burger())

    return listOfFood


todayOrders = [['HotDog', 10], ['Burger', 5]]
print(createFoodList(todayOrders))

我想知道是否可以使用列表理解或类似方法来使我的createFoodList功能更好?因为我的想法是有很多不同的种类Food,所以如果我可以返回这个食物列表,基于todayOrders列表['type of food', count]并返回[food, food, food.. ]。我现在做的方式真的很复杂很长(我感觉这不是正确的方式)。

非常感谢。

编辑:除了列表理解之外,我还能做些什么来替换 if 语句createFoodList?这是决定的[[food, count], [food, count]..],我创建了那个食物并将它附加到我的列表中。

4

2 回答 2

4
foodmap = {'HotDog': HotDog, 'Burger': Burger}

print [foodmap[f]() for (f, c) in todayOrders for x in range(c)]

foodmap[f]评估为HotDogor Burger(这些是类 - 不是类名,类本身)。调用someclass()创建一个实例,soemclass调用时不传递任何参数someclass.__init__。因此foodmap[f]()结合了这两者 - 它在其中查找类foodmap并使用该类来创建该类的实例。

于 2012-04-05T18:45:39.100 回答
2

这看起来更像是工厂模式。您可以尝试以下解决方案

>>> class Food():
    def __init__(self,name='Food'):
        self.name = name
    def __repr__(self):
    return self.name

>>> class HotDog(Food):
    def __init__(self):
        Food.__init__(self,'HotDog')


>>> class Burger(Food):
    def __init__(self):
        Food.__init__(self,'Burger')

>>> def createFoodList(myOrders):
    return [apply(order[0]) for order in myOrders for i in xrange(0,order[1]) if callable(order[0])]

>>> todayOrders = [[HotDog, 10], [Burger, 5]]
>>> print(createFoodList(todayOrders))
[HotDog, HotDog, HotDog, HotDog, HotDog, HotDog, HotDog, HotDog, HotDog, HotDog, Burger, Burger, Burger, Burger, Burger]
于 2012-04-05T19:26:48.207 回答