对Python

时间:2016-07-06 17:06:59

标签: python class error-handling attributes

我正在尝试执行以下项目:

想象一下,你已经开办了一家小餐馆,并试图让它更容易接受和计算订单。由于您的餐厅仅销售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'

4 个答案:

答案 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_Itemfood将指向一所房子。 (假设您没有明确说出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()

该功能一直执行,直到您输入“完成”字样为止,它会打印每笔订单所花费的金额,以及所花费的总金额(对于所有订单)。