0

私は小さなテキストベースの結果のゲームに取り組んでいますが、このリストを作成するのに問題があります。すべての(バーガーまたはホットドッグのいずれか)Foodをに入れたいと思います。私の例では、2つしか含めていませんが、それらはすべて食品の「ベース」です。FoodlistOfFood

その後、私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]HotDogまたはのいずれかに評価されます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 に答える