我正在尝试执行以下项目:
想象一下,你已经开办了一家小餐馆,并试图让它更容易接受和计算订单。由于您的餐厅仅销售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 :(得分:0)
为什么要在这里访问Menu_Item?这就是班级本身;您从列表中获得的项目称为food
。
答案 1 :(得分: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_Item
,food
将指向一所房子。 (假设您没有明确说出Menu_Item = ...
或同样food = ...
)
此外,python没有编译器。它不是一种编译语言。
你应按惯例继承object
; class MenuItem(object):
食物可以更好地实现为具有类属性的类继承自MenuItem
。
类属性是在类的主体中定义的属性。例如:
class HotDog(MenuItem):
price = 1.5
会让你写HotDog.price
并接收1.5
作为答案。
答案 2 :(得分:0)
你在这里遇到了几个问题。最值得注意的是Daniel Roseman和uoɥʇʎPʎzɐɹC指出的那个。但是,在解决该问题后,您的代码仍会出现问题。
在take_order()
中,您需要将return count
移到for循环之外,否则您将在添加第一个项目后返回计数。您还需要将输入更改为整数,否则b == food.num
将永远不会解析为True。
答案 3 :(得分: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()
该功能一直执行,直到您输入“完成”字样为止,它会打印每笔订单所花费的金额,以及所花费的总金额(对于所有订单)。