类和对象课后作业提问
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} 元,欢迎下次光临~")
代码中 def pay(self)这一段里each.num是怎么匹配的呢?
如果我点了两次dish1,self.x列表里是对吗?
这是each.num是如何储存的? 在您的代码中,`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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-12-14 18:31
在您的代码中,`each.num` 是动态添加到每个订单项对象上的一个属性。具体执行过程如下:
1. 在 `order` ...
两个对象实例可以是同名的吗? 我是春鸡 发表于 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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-12-14 18:48
是的,在 Python 中,两个对象实例可以具有相同的名字,尤其是在不同的上下文中。当两个对象实例共享同 ...
egg1和egg2也不完全相同吧?self.x中的应该是同样的onion或beef这样的名称?这样也不会覆盖吗? 我是春鸡 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]