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)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐