[英]Confused about AttributeError in 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'
您為什么在這里訪問Menu_Item? 那是班級本身; 您從清單中得到的物品稱為food
。
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_Item
, food
將指代一所房子。 (假設您沒有明確說出Menu_Item = ...
或Menu_Item = ...
地food = ...
)
另外,python沒有編譯器。 它不是編譯語言。
您應該按照約定繼承object
。 class MenuItem(object):
這些食物將更好地實現為具有繼承自MenuItem
類屬性的類 。
類屬性是在類主體中定義的屬性。 例如:
class HotDog(MenuItem):
price = 1.5
讓您編寫HotDog.price
並獲得1.5
的答案。
您在這里遇到了幾個問題。 最值得注意的是Daniel Roseman和uoPʎzɐɹC指出的那個。 但是,解決該問題后,您的代碼仍然會遇到問題。
在take_order()
您需要將return count
移出for循環之外,否則您將在添加第一項后返回計數。 您還需要將輸入更改為整數,或者b == food.num
永遠不會解析為True。
除了收到有用的答案外,我還想指出,您可以使用簡單的函數解決此問題,而不必定義新的類(根據您所寫的內容,該項目不需要這樣做)。
首先,您可以創建菜單上的項目及其價格的字典:
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()
該功能會一直執行,直到您鍵入單詞“ done”(完成),然后打印每筆訂單花費的金額以及所花費的總金額(所有訂單加在一起)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.