2271040868 发表于 2023-4-15 15:00:27

这段餐厅点餐小程序我看了好久主函数都没看懂,学习进度卡在这了,有没有大佬解析...

这段餐厅点餐小程序我看了好久主函数都没看懂,学习进度卡在这了,有没有大佬解析一下,



class Meet:
    nums = 0
   
class Egg(Meet):
    name = "鸡蛋"
    price = 1
   
class Beef(Meet):
    name = "牛肉"
    price = 25
   
class Mutoon(Meet):
    name = "羊肉"
    price = 30
   
class Vegetable:
    nums = 0
   
class Onion(Vegetable):
    name = "洋葱"
    price = 2
   
class Tomato(Vegetable):
    name = "番茄"
    price = 2
   
class Potato(Vegetable):
    name = "土豆"
    price = 3
   
class Radish(Vegetable):
    name = "萝卜"
    price = 3
   
class Menu:
    def order(self):
      self.x = []
      print("客官想要吃点什么?")
   
      dishes = input("1.洋葱炒牛肉;2.洋葱炒羊肉;3.煎蛋;4.番茄炒蛋;5.土豆萝卜炖羊肉:")
      dishes = dishes.split()
   
      while dishes:
            dish = dishes.pop(0)
            
            if dish == '1':
                onion = Onion()
                onion.num = 1
                beef = Beef()
                beef.num = 1
                self.x.extend()
   
            if dish == '2':
                onion = Onion()
                onion.num = 1
                mutoon = Mutoon()
                mutoon.num = 1
                self.x.extend()
   
            if dish == '3':
                egg = Egg()
                egg.num = 2
                self.x.append(egg)
   
            if dish == '4':
                tomato = Tomato()
                tomato.num = 2
                egg = Egg()
                egg.num = 3
                self.x.extend()
   
            if dish == '5':
                potato = Potato()
                potato.num = 2
                radish = Radish()
                radish.num = 1
                mutoon = Mutoon()
                mutoon.num = 2
                self.x.extend()
            
    def pay(self):
      total = 0
      for each in self.x:
            print(each.name, each.price, "*", each.num)
            total += each.price * each.num
   
      print(f"感谢惠顾,您一共消费了 {total} 元,欢迎下次光临~")

Menu()

歌者文明清理员 发表于 2023-4-15 15:03:36

这是一个餐厅点餐小程序,主要包含以下类:

1. Meet:肉类的父类,包含属性nums。
2. Egg、Beef、Mutoon:肉类子类,继承自Meet,分别表示鸡蛋、牛肉、羊肉,都包含属性name和price。
3. Vegetable:蔬菜的父类,包含属性nums。
4. Onion、Tomato、Potato、Radish:蔬菜子类,继承自Vegetable,分别表示洋葱、番茄、土豆、萝卜,都包含属性name和price。
5. Menu:菜单类,包含方法order和pay。
   - order方法:要求用户输入要点的菜品,根据输入的数字判断需要点的菜品,然后生成相应的对象(包括肉类和蔬菜),并将对象加入到属性x中。
   - pay方法:遍历属性x,计算总价,并输出每个菜品的名称、单价和数量,最后输出总价。

在代码的最后,调用了Menu的构造函数,也就是实例化了一个Menu对象,这样用户就可以通过该对象进行点餐和结账了。

isdkz 发表于 2023-4-15 15:05:41

这段代码是一个简单的餐厅点餐系统,首先定义了各种食材(Meat和Vegetable及其子类)以及菜单(Menu类),接着提供一个方法进行点餐(order方法)和计算支付金额(pay方法)。接下来,我简要解析下主要功能。

首先,定义了两个大类的食材,Meat(肉类)和Vegetable(蔬菜类)。Meat类下有三个子类:Egg(鸡蛋),Beef(牛肉),Mutoon(羊肉);Vegetable类下有四个子类:Onion(洋葱),Tomato(番茄),Potato(土豆),Radish(萝卜)。每个子类都有自己的名称和价格。

然后,定义了一个菜单(Menu)类,包含两个方法:

1、order方法:负责接收用户输入的菜品编号,然后根据菜品编号创建相应的食材对象,设置数量,并将这些食材对象存储在self.x列表中。

2、pay方法:负责遍历self.x列表,计算每种食材的总价,并输出总金额。

最后,代码中使用了Menu()创建了一个Menu类的实例,但没有调用任何方法。为了让程序正常运行,需要修改最后一行代码,将Menu()改为:

menu = Menu()
menu.order()
menu.pay()

这样,程序会创建一个Menu实例,调用order方法进行点餐,然后调用pay方法结算并输出总金额。

歌者文明清理员 发表于 2023-4-15 15:29:52

isdkz 发表于 2023-4-15 15:05
这段代码是一个简单的餐厅点餐系统,首先定义了各种食材(Meat和Vegetable及其子类)以及菜单(Menu类), ...

得出结论,chatgpt 不是一个吃货{:5_97:}

陶远航 发表于 2023-4-15 16:31:48

这段代码实现了一个简单的餐厅点餐小程序,其中定义了几个类来表示食材和菜单,以及一个 Menu 类来实现点餐和计算账单的功能。具体来说:

- Meet、Egg、Beef、Mutoon、Vegetable、Onion、Tomato、Potato 和 Radish 这几个类分别代表了各种食材,每个类中定义了食材的名称和价格。
- Menu 类中定义了 order 和 pay 两个方法,分别实现了点餐和计算账单的功能。
- 在 order 方法中,程序首先打印出提示信息,让用户输入想要点的菜。接着,根据用户输入的菜名,依次创建对应的食材对象,并将它们的数量设置为对应的值,最后将这些食材对象加入到一个列表 x 中。
- 在 pay 方法中,程序首先遍历列表 x 中的每个食材对象,将其名称、价格和数量打印出来,并累加总价。最后打印出总价。

总的来说,这段代码比较简单,主要是通过类和方法来实现了点餐和计算账单的功能。如果你不熟悉面向对象编程的基本概念和语法,建议先学习一下相关的知识。同时,如果你想深入理解这段代码,也可以试着将其复现一遍,并逐步调试和理解每一行代码的作用。

2271040868 发表于 2023-4-15 22:30:28

isdkz 发表于 2023-4-15 15:05
这段代码是一个简单的餐厅点餐系统,首先定义了各种食材(Meat和Vegetable及其子类)以及菜单(Menu类), ...

大佬,我看不懂为什么用onion.num不报错,不明白这个 “.”的原理和意义

isdkz 发表于 2023-4-15 22:35:46

2271040868 发表于 2023-4-15 22:30
大佬,我看不懂为什么用onion.num不报错,不明白这个 “.”的原理和意义

在Python中,.(点)操作符用于访问对象的属性和方法。在这个例子中,当你用onion.num这样的语法时,实际上是在访问onion这个实例对象的num属性。具体来说:


[*]当你创建一个Onion实例对象时,onion = Onion(),onion对象会继承Onion类以及其父类Vegetable的属性和方法。

[*]当你给onion对象的num属性赋值,如onion.num = 1,Python会在onion对象中创建一个名为num的属性,并将值1赋给它。如果onion对象没有num属性,Python会为它动态创建这个属性。


注意,在这个例子中,类似onion.num的属性并没有在Vegetable类或Onion类中定义。由于Python具有动态属性的特性,这样的代码不会报错。当你首次赋值给一个实例对象的属性时,Python会动态地为该实例对象创建这个属性。

不过,在实际编程中,我们通常会在类的__init__方法中明确地初始化实例属性,以使代码更清晰和可维护。在这个例子中,可以为Vegetable类和Meet类添加__init__方法,明确地初始化num属性:

class Meet:
    def __init__(self):
      self.num = 0

class Vegetable:
    def __init__(self):
      self.num = 0

这样,当创建子类实例时(如onion = Onion()),它们的num属性会被自动初始化为0,然后你可以根据需要修改它们的值。

2271040868 发表于 2023-4-16 21:49:50

isdkz 发表于 2023-4-15 22:35
在Python中,.(点)操作符用于访问对象的属性和方法。在这个例子中,当你用onion.num这样的语法时,实际 ...

感谢讲的这么细,太谢谢了
页: [1]
查看完整版本: 这段餐厅点餐小程序我看了好久主函数都没看懂,学习进度卡在这了,有没有大佬解析...