【问题标题】:Create a list of objects创建对象列表
【发布时间】:2012-04-05 18:41:38
【问题描述】:

我正在开发一个基于文本的小型合成游戏,但我在创建这个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.. ]。我现在做的方式真的很复杂很长(我感觉这不是正确的方式)。

非常感谢。

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

【问题讨论】:

  • 顺便说一句,为什么要为每个订单创建一个 Food 实例?据我所知,你们所有的汉堡包都是一样的。如果确实如此,您可以创建一个实例并重复使用它。

标签: python list class


【解决方案1】:
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 中查找类并使用该类创建该类的实例。

【讨论】:

  • 你能给我解释一下这个解决方案吗?我不确定这是如何访问todayOrders[[]..] 就像我知道列表的结构[[food, count], [food, count]... ]
  • 我又看了一下列表理解页面,我想我现在知道那部分了,只是 foodmap[f]() 需要澄清一下。当foodmap[f] 返回时,那是一个对象吗?因为我不认为那是一个字符串。谢谢伊格纳西奥。
  • foodmap 是字符串到类的映射。使用字符串对其进行索引会返回类,然后调用它的构造函数。
  • 如果您的每个食物类别都有一个name 字符串(无论如何都应该),您甚至可以不使用foodmap[food() for food in [HotDog, Burger,..] for order_name, qty in todayOrders for _ in range(qty) if food.name == order_name]。但这绝对是太长了。
  • 令人印象深刻的实现......但它变得相当混乱 D:非常感谢@9000
【解决方案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]

【讨论】:

  • 感谢您提供替代实现,我学习了其他功能apply()
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2018-05-25
相关资源
最近更新 更多