鱼C论坛

 找回密码
 立即注册
查看: 81|回复: 5

[已解决]类和对象课后作业提问

[复制链接]
发表于 2024-12-14 18:31:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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([beef, onion])
   
            if dish == '2':
                onion = Onion()
                onion.num = 1
                mutoon = Mutoon()
                mutoon.num = 1
                self.x.extend([mutoon, onion])
   
            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([tomato, egg])
   
            if dish == '5':
                potato = Potato()
                potato.num = 2
                radish = Radish()
                radish.num = 1
                mutoon = Mutoon()
                mutoon.num = 2
                self.x.extend([potato, radish, mutoon])
            
    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} 元,欢迎下次光临~")



代码中 def pay(self)这一段里each.num是怎么匹配的呢?
如果我点了两次dish1,self.x列表里是[beef, onion,beef, onion]对吗?
这是each.num是如何储存的?
最佳答案
2024-12-14 18:31:37
在您的代码中,`each.num` 是动态添加到每个订单项对象上的一个属性。具体执行过程如下:

1. 在 `order` 方法中,当用户输入对应菜品的编号时,代码会创建该菜品的实例(例如 `Onion()`, `Beef()` 等)。
   
2. 对这些实例化的对象(如 `onion`, `beef`)通过 `onion.num = 1` 这样的语句动态添加 `num` 属性,用来表示点了这个菜多少次。

3. 这些对象然后被追加到列表 `self.x` 中。

由于初始化时没有给 `self.x` 赋值,当试图调用 `self.x.extend()` 或 `self.x.append()` 时,会引发错误。要修复,建议在 `order` 方法开始处初始化 `self.x` 为空列表:
self.x = []

如果用户点了两次 `dish1`,则 `order` 方法应该将两个对应的菜品对象(`Onion` 和 `Beef`)各自再加一次到 `self.x` 列表中。这样,`self.x` 会包含两个 `Onion` 和两个 `Beef` 对象,各自的 `num` 属性都是 `1`。

在 `pay` 方法中,`for each in self.x` 会依次遍历 `self.x` 中的每个对象,并打印出它的 `name`、`price` 和 `num`,计算出总价。

请确保在 `order` 方法中处理多次点同一个菜单项的逻辑,例如正确累计数量等。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-14 18:31:37 | 显示全部楼层    本楼为最佳答案   
在您的代码中,`each.num` 是动态添加到每个订单项对象上的一个属性。具体执行过程如下:

1. 在 `order` 方法中,当用户输入对应菜品的编号时,代码会创建该菜品的实例(例如 `Onion()`, `Beef()` 等)。
   
2. 对这些实例化的对象(如 `onion`, `beef`)通过 `onion.num = 1` 这样的语句动态添加 `num` 属性,用来表示点了这个菜多少次。

3. 这些对象然后被追加到列表 `self.x` 中。

由于初始化时没有给 `self.x` 赋值,当试图调用 `self.x.extend()` 或 `self.x.append()` 时,会引发错误。要修复,建议在 `order` 方法开始处初始化 `self.x` 为空列表:
self.x = []

如果用户点了两次 `dish1`,则 `order` 方法应该将两个对应的菜品对象(`Onion` 和 `Beef`)各自再加一次到 `self.x` 列表中。这样,`self.x` 会包含两个 `Onion` 和两个 `Beef` 对象,各自的 `num` 属性都是 `1`。

在 `pay` 方法中,`for each in self.x` 会依次遍历 `self.x` 中的每个对象,并打印出它的 `name`、`price` 和 `num`,计算出总价。

请确保在 `order` 方法中处理多次点同一个菜单项的逻辑,例如正确累计数量等。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-14 18:41:51 | 显示全部楼层
FishC 发表于 2024-12-14 18:31
在您的代码中,`each.num` 是动态添加到每个订单项对象上的一个属性。具体执行过程如下:

1. 在 `order` ...

两个对象实例可以是同名的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-14 18:48:54 | 显示全部楼层
我是春鸡 发表于 2024-12-14 18:41
两个对象实例可以是同名的吗?


是的,在 Python 中,两个对象实例可以具有相同的名字,尤其是在不同的上下文中。当两个对象实例共享同一个变量名时,它们的引用取决于代码的执行位置和时间。这意味着你可以用相同的变量名来创建不同的对象实例,但后一个实例会覆盖前一个实例的引用。

这里有个例子帮助理解:
# 创建第一个实例
egg1 = Egg()
egg1.num = 1

# 使用相同变量名创建第二个实例
egg2 = Egg()
egg2.num = 2

# 现在,egg1 和 egg2 是两个不同的对象
print(egg1.num)  # 输出:1
print(egg2.num)  # 输出:2

在上面的例子中,即使使用相同的类 `Egg`,使用了相同的变量名 `egg1` 和 `egg2`,但它们实际上是两个不同的实例对象,各自维护自己的数据。

所以,在不同的作用域中,尽管对象实例可以有相同的名字,但这些名字实际上是引用不同的内存空间中的对象。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-15 20:30:08 | 显示全部楼层
FishC 发表于 2024-12-14 18:48
是的,在 Python 中,两个对象实例可以具有相同的名字,尤其是在不同的上下文中。当两个对象实例共享同 ...

egg1和egg2也不完全相同吧?self.x中的应该是同样的onion或beef这样的名称?这样也不会覆盖吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-15 20:30:33 | 显示全部楼层
我是春鸡 发表于 2024-12-15 20:30
egg1和egg2也不完全相同吧?self.x中的应该是同样的on ...


在 Python 中,即使 `egg1` 和 `egg2` 是通过相同的类创建的实例,它们也是不同的对象实例,存储在不同的内存位置。因此,它们的属性(例如 `num`)是独立的,互不影响。

同理,当你在 `self.x` 中添加多个不同的对象实例时,即使这些对象实例都来自相同的类(例如 `Onion` 或 `Beef`),这些实例也是不同的,并不会相互覆盖。例如:
# 假设 self.x 起初是一个空列表
onion1 = Onion()
onion1.num = 1
self.x.append(onion1)

onion2 = Onion()
onion2.num = 2
self.x.append(onion2)

在上面的代码中,`onion1` 和 `onion2` 是两个不同的 `Onion` 类实例,它们分别被添加到 `self.x` 列表中,各自持有自己的 `num` 属性值。因此,对象不会相互覆盖。

总结一下:只要你使用 `append` 或 `extend` 方法在列表中添加(即使名称相同)新创建的对象实例,它们就会储存在列表的不同位置,不会相互覆盖。这是因为它们是不同的内存实例。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表