我正在开发一个基于文本的小游戏,但是我正在制作这个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
,我创造了这些食物并将其附加到我的列表中。
答案 0 :(得分:4)
foodmap = {'HotDog': HotDog, 'Burger': Burger}
print [foodmap[f]() for (f, c) in todayOrders for x in range(c)]
foodmap[f]
评估为HotDog
或Burger
(这些是类 - 不是类名,类本身)。调用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]