簡體   English   中英

對Python中的AttributeError感到困惑

[英]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_Itemfood將指代一所房子。 (假設您沒有明確說出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM