创建对象列表

时间:2012-04-05 18:41:39

标签: python list class

我正在开发一个基于文本的小游戏,但是我正在制作这个Food列表时遇到麻烦,我想将所有Food(汉堡或热狗)放入{{{ 1}}。在我的例子中,我只包括两个,但它们都是食物的“基础”。

稍后我将遍历我的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,我创造了这些食物并将其附加到我的列表中。

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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]