2016-07-06 2 views
0

Я пытаюсь сделать следующий проект:Confused о 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 вы должны назвать классы с помощью CamelCase по соглашению и PEP 8. Итак, MenuItem вместо Menu_Item. Вы также должны указывать переменные, используя separated_by_underscores. Таким образом, вы можете легко различать классы и обычные объекты.

Я думаю, что вы хотите:

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

Таким образом, вместо сравнения уличного адреса Blueprint, вы сравните уличный адрес фактического дома. Python ≠ английский; план всегда Menu_Item и food будет ссылаться на дом. (при условии, что вы явно не указали Menu_Item = ... или аналогично food = ...)

Кроме того, у python нет компилятора. Это не скомпилированный язык.

Вы должны наследовать object по соглашению; class MenuItem(object):

Продукты будут лучше реализованы как классы с класса атрибутов, которые наследуют прочь MenuItem.

Атрибуты класса - это атрибуты, определенные в теле класса. Например:

class HotDog(MenuItem): 
    price = 1.5 

позволит вам написать HotDog.price и получить 1.5 в качестве ответа.

+0

Очень полезно! Спасибо – brianhalperin

+0

@brianhalperin, если вы перевернули и нажали галочку, я бы получил репутацию для ответа. Репутация очень ценная. –

0

У вас здесь несколько проблем.Наиболее заметно тот, на который указал Даниэль Роземан и 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() 

Функция продолжает выполняться до тех пор, пока вы не наберете слово «сделано», и печатает количество денег, потраченное на каждый заказ, а также общую сумму потраченных денег (для всех заказов вместе).