Python 自定义容器类
·
SmartRefrigerator 是一个以冰箱为原型设计的 Python 自定义容器类。它使用字典(dict)作为底层数据结构,将食物名称作为键,数量作为值,模拟日常生活中对冰箱的各类操作:查看、添加、使用、丢弃、合并等。清晰展示 __getitem__、__setitem__、__delitem__、__len__、__contains__、__iter__、__str__、__bool__、__add__ 等方法的用途与调用时机。
class SmartRefrigerator:
"""
智能冰箱:用字典模拟冰箱里的食物存储。
食物名(如"牛奶")为键,数量(如2盒)为值。
所有操作都像在真实使用冰箱一样自然。
"""
def __init__(self, foods=None):
"""
初始化冰箱。
:param foods: 初始食物字典,例如 {"牛奶": 2, "鸡蛋": 12}
"""
self._foods = dict(foods) if foods else {}
def __getitem__(self, food_name):
"""
查看某种食物还有多少(打开冰箱找"牛奶")。
示例:fridge["牛奶"]
"""
return self._foods[food_name]
def __setitem__(self, food_name, quantity):
"""
放入或更新食物数量(往冰箱放"3盒酸奶")。
示例:fridge["酸奶"] = 3
如果数量为0或负数,自动删除该食物(吃光了)。
"""
if quantity <= 0:
# 吃光了或扔掉了,就从冰箱移除
self._foods.pop(food_name, None)
else:
self._foods[food_name] = quantity
def __delitem__(self, food_name):
"""
主动清空某种食物(比如过期了,直接扔掉)。
示例:del fridge["剩菜"]
"""
del self._foods[food_name]
def __len__(self):
"""
冰箱里有几种食物?(不是总数量,而是种类数)
示例:len(fridge) → 3(牛奶、鸡蛋、酸奶)
"""
return len(self._foods)
def __contains__(self, food_name):
"""
冰箱里有没有这个东西?
示例:"苹果" in fridge → True/False
"""
return food_name in self._foods
def __iter__(self):
"""
遍历冰箱里的所有食物名(像打开冰箱门一一查看)。
示例:for food in fridge: print(food)
"""
return iter(self._foods)
def __str__(self):
"""
打印冰箱内容(友好格式,像贴在冰箱门上的清单)。
"""
if not self._foods:
return "【冰箱空空如也,该买菜啦!】"
lines = ["【冰箱内容】"]
for food, qty in self._foods.items():
lines.append(f" - {food}: {qty}")
return "\n".join(lines)
def __repr__(self):
"""
调试用的冰箱状态(开发者视角)。
"""
return f"{self.__class__.__name__}({self._foods!r})"
def __bool__(self):
"""
冰箱是不是空的?用于 if 判断。
示例:if not fridge: print("快饿死了!")
"""
return bool(self._foods)
def __add__(self, other):
"""
合并两个冰箱的食物(比如搬家时把两个冰箱合并)。
同种食物数量相加。
示例:new_fridge = fridge1 + fridge2
"""
if not isinstance(other, SmartRefrigerator):
return NotImplemented
result = SmartRefrigerator(self._foods.copy())
for food, qty in other._foods.items():
result[food] = result.get(food, 0) + qty
return result
def get(self, food_name, default=0):
"""
安全获取食物数量(没有也不报错)。
示例:fridge.get("苹果", 0)
"""
return self._foods.get(food_name, default)
def add(self, food_name, amount=1):
"""
往现有食物上增加数量(比如又买了一盒牛奶)。
示例:fridge.add("牛奶", 1)
"""
current = self.get(food_name)
self[food_name] = current + amount
def use(self, food_name, amount=1):
"""
使用(吃掉)一定数量的食物。
如果吃光了,自动从冰箱移除。
示例:fridge.use("鸡蛋", 2)
"""
current = self.get(food_name)
if current < amount:
raise ValueError(f"冰箱里只有 {current} 份 {food_name},不够用!")
self[food_name] = current - amount
# ===== 🧪 使用示例:真实场景模拟 =====
if __name__ == '__main__':
print("🛒 买完菜回家,把食物放进冰箱...")
fridge = SmartRefrigerator({
"牛奶": 2,
"鸡蛋": 12,
"苹果": 5,
"面包": 1
})
print(fridge)
print("\n🍳 早上做早餐:用掉2个鸡蛋、1盒牛奶")
fridge.use("鸡蛋", 2)
fridge.use("牛奶", 1)
print(fridge)
print("\n🥛 发现牛奶快没了,又买了一盒")
fridge.add("牛奶", 1)
print(fridge)
print("\n❓ 冰箱里有酸奶吗?")
print("有酸奶?", "酸奶" in fridge)
print("\n🛒 又买了酸奶和橙子")
fridge["酸奶"] = 2
fridge["橙子"] = 6
print(fridge)
print("\n🗑️ 面包过期了,扔掉!")
del fridge["面包"]
print(fridge)
print("\n📦 搬家!把父母家的冰箱也搬来了")
parents_fridge = SmartRefrigerator({"牛奶": 1, "橙子": 4, "火腿": 1})
new_fridge = fridge + parents_fridge
print("合并后的新冰箱:")
print(new_fridge)
print("\n🔍 查看总共有几种食物?")
print("食物种类数:", len(new_fridge))
print("\n🥲 最后,把冰箱吃空了...")
empty_fridge = SmartRefrigerator()
print(empty_fridge)
print("冰箱空了吗?", not empty_fridge)
更多推荐
所有评论(0)