2016-07-06 92 views
0

我嘗試做以下項目:困惑AttributeError的Python中

想象你已經開始了一個小餐館,並試圖使其更容易採取和計算的訂單。由於您的餐廳只銷售9種不同的商品,因此您將每個商品分配給一個數字,如下所示。

Chicken Strips - $3.50 
French Fries - $2.50 
Hamburger - $4.00 
Hotdog - $3.50 
Large Drink - $1.75 
Medium Drink - $1.50 
Milk Shake - $2.25 
Salad - $3.75 
Small Drink - $1.25 

要快速接受訂單,您的程序應該允許用戶鍵入一串數字,然後它應該計算訂單的成本。例如,如果訂購了一個大型飲料,兩個小飲料,兩個漢堡包,一個熱狗和一份沙拉,用戶應該輸入5993348,程序應該說它的成本爲19.50美元。此外,請確保程序循環,以便用戶可以執行多個訂單,而不必每次都重新啓動程序。

我的代碼看起來像這樣至今:

print "------------------Menu-------------------" 

class Menu_Item(): 
    def __init__(self, num,item,price): 
     self.num = num 
     self.item = item 
     self.price = price 
    def __repr__(self): 
     return "\n" + str(self.num) + ". " + self.item + " - $" + str(self.price) + ' dollars' 



Strips = Menu_Item(1,'Chicken Strips', 3.50) 
Fries = Menu_Item(2,"Fries",2.50) 
Burger = Menu_Item(3,"Burger",4.00) 
Hotdog = Menu_Item(4,"Hotdog",3.50) 
Large_Drink = Menu_Item(5,"Large Drink",1.75) 
Medium_Drink = Menu_Item(6,"Medium Drink", 1.50) 
Milkshake = Menu_Item(7,"Milkshake", 2.25) 
Salad = Menu_Item(8,"Salad", 3.75) 
Small_Drink = Menu_Item(9,"Small Drink", 1.25) 


Class_Items = [Strips,Fries,Burger,Hotdog,Large_Drink,Medium_Drink,Milkshake,Salad,Small_Drink] 


print Class_Items 

def take_order(): 
    count = 0 
    string = raw_input("Enter your order") 
    order = [] 
    for a in string: 
     order.append(a) 
    for food in Class_Items: 
     for b in order: 
      if b == Menu_Item.num: 
       count = count + Menu_Item.price 
       return count 
      else: 
       print "-" 

take_order() 

我收到以下錯誤。我已經嘗試了很多方法來完成這項工作,但我無法弄清楚爲什麼編譯器不能識別num屬性。有關爲何發生這種情況的任何建議?謝謝!

Traceback (most recent call last): 
    File "python", line 43, in <module> 
    File "python", line 37, in take_order 
AttributeError: class Menu_Item has no attribute 'num' 

回答

0

你爲什麼在這裏訪問Menu_Item?這是班級本身;您從列表中獲得的項目被稱爲food

0

Menu_Item是班級。您試圖訪問該類的一個屬性。想想像一個房子的藍圖班。你問了藍圖的街道地址。

在Python中,您應該按慣例和PEP 8命名爲CamelCase。因此,MenuItem而不是Menu_Item。你也應該使用separated_by_underscores來命名變量。這樣,您可以輕鬆區分類和普通對象。

我想你想要的是:

for food in Class_Items: 
    for b in order: 
     if b == food.num: 
      ... 

這種方式,而不是比較藍圖的街道地址,你比較實際的房子的街道地址。 Python≠英文;藍圖總是Menu_Itemfood將指房子。 (假設你沒有明確地說Menu_Item = ...或同樣food = ...

另外,python沒有編譯器。這不是一種編譯語言。

你應該按照慣例繼承object; class MenuItem(object):

食物將被更好地實施爲具有類別屬性的類別,其繼承關閉MenuItem

類屬性是在類的主體中定義的屬性。例如:

class HotDog(MenuItem): 
    price = 1.5 

會讓你寫HotDog.price和接收1.5的答案。

+0

非常有幫助!謝謝 – brianhalperin

+0

@brianhalperin如果您提出並點擊了選中標記,我將獲得回答的聲望。聲譽是非常寶貴的。 –

0

這裏有幾個問題。最引人注目的是Daniel Roseman和uoɥʇʎPʎzɐɹC指出的那個。但是,解決該問題後,您的代碼仍然存在問題。

take_order()您需要將return count移到您的for循環之外,否則您將在添加第一個項目後返回計數。您還需要將輸入更改爲一個整數,否則b == food.num將永遠不會解析爲True。

+0

uoɥʇʎPʎzɐɹC只是一個臨時名稱。 CrazyPython是我的真名(我們來自codegolf.se的土地:)) –

0

除了您收到的有用答案之外,我只想指出,您可以使用簡單的函數解決此問題,而無需定義新類(該項目不需要這樣做,根據您的需求寫)。

首先,你可以創建菜單上的項目,其價格的字典:

menu_items={'1':['Chicken Strips',3.50],'2':['French Fries',2.50],'3':['Hamburger',4.00],'4':['Hotdog',3.50],'5':['Large Drink',1.75],'6':['Medium Drink',1.50],'7':['Milk Shake',2.25],'8':['Salad',3.75],'9':['Small Drink',1.25]} 

之後,您可以創建一個解決你需要一個功能:

def total_order(): 
    total=0 
    while True: 
     order=str(input('Please enter your order, or type "done" to terminate the program: ')) 
     sum_order=0 
     if order=='done': 
      print('\nProgram terminated. The overall total order is: '+str(total)+'$') 
      return total 
     for number in order: 
      if number in menu_items: 
       sum_order+=menu_items[number][1] 
     total+=sum_order 
     print('The total for this order is: '+str(sum_order)+'$\n') 
total_order() 

該函數會一直執行,直到您鍵入單詞「完成」,並且它會打印每筆訂單花費的金額以及花費的總金額(所有訂單一起)。