You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python面向对象:基于phone类实现magasin子类的库存管理

分文件实现Phone类修正与Magasin类开发

1. 修正Phone类(phone.py)

原代码的属性装饰器错误是因为**@property方法名与实例变量重名**,导致调用时无限递归。修正方案是用下划线开头的内部变量存储实际值,对外通过@property暴露属性:

from datetime import datetime

class Phone:
    def __init__(self, brand: str, model: datetime, price: float, quantity: int):
        # 内部变量用下划线开头,避免与@property方法名冲突
        self._brand = brand
        self._model = model
        self._price = price
        self._quantity = quantity

    # 品牌属性(带类型校验)
    @property
    def brand(self) -> str:
        return self._brand

    @brand.setter
    def brand(self, value: str):
        if not isinstance(value, str):
            raise TypeError("品牌必须为字符串类型")
        self._brand = value

    # 型号日期属性(带类型校验)
    @property
    def model(self) -> datetime:
        return self._model

    @model.setter
    def model(self, value: datetime):
        if not isinstance(value, datetime):
            raise TypeError("型号日期必须是datetime对象")
        self._model = value

    # 价格属性(带非负校验)
    @property
    def price(self) -> float:
        return self._price

    @price.setter
    def price(self, value: float):
        if value < 0:
            raise ValueError("价格不能为负数")
        self._price = value

    # 库存数量属性(带非负校验)
    @property
    def quantity(self) -> int:
        return self._quantity

    @quantity.setter
    def quantity(self, value: int):
        if value < 0:
            raise ValueError("库存数量不能为负数")
        self._quantity = value

    # 自定义打印格式,方便查看对象信息
    def __repr__(self):
        return f"Phone(brand='{self.brand}', model={self.model.strftime('%Y-%m-%d')}, price={self.price}, quantity={self.quantity})"

2. 实现Magasin类(magasin.py)

该类负责维护Phone对象列表,实现添加手机、展示库存的功能,需要导入Phone类:

from phone import Phone
from datetime import datetime

class Magasin:
    def __init__(self):
        # 用内部列表存储所有Phone对象
        self._phones = []

    def add_phone(self, phone: Phone):
        """添加手机,若存在同款则累加库存"""
        if not isinstance(phone, Phone):
            raise TypeError("只能添加Phone类的实例对象")
        
        # 检查是否已有同款(品牌+型号日期一致)
        existing_phone = next(
            (p for p in self._phones if p.brand == phone.brand and p.model == phone.model),
            None
        )
        if existing_phone:
            existing_phone.quantity += phone.quantity
            print(f"已更新同款手机库存:{existing_phone.brand} {existing_phone.model.strftime('%Y-%m-%d')},当前库存{existing_phone.quantity}")
        else:
            self._phones.append(phone)
            print(f"成功添加新手机:{phone.brand} {phone.model.strftime('%Y-%m-%d')}")

    def stock(self):
        """展示所有手机库存"""
        if not self._phones:
            print("当前库存为空")
            return
        
        print("=== 手机库存清单 ===")
        for index, phone in enumerate(self._phones, start=1):
            print(
                f"{index}. 品牌:{phone.brand} | 型号日期:{phone.model.strftime('%Y-%m-%d')} "
                f"| 单价:{phone.price}元 | 库存:{phone.quantity}台"
            )

3. 使用示例

可以创建main.py或者直接在magasin.py末尾添加测试代码:

if __name__ == "__main__":
    # 创建几个Phone实例
    iphone15 = Phone("苹果", datetime(2023, 9, 22), 5999.0, 12)
    mate60 = Phone("华为", datetime(2023, 9, 25), 4999.0, 18)
    iphone15_add = Phone("苹果", datetime(2023, 9, 22), 5999.0, 8)  # 同款,测试库存累加

    # 创建商店实例
    my_store = Magasin()

    # 添加手机
    my_store.add_phone(iphone15)
    my_store.add_phone(mate60)
    my_store.add_phone(iphone15_add)

    # 展示库存
    my_store.stock()

运行后会输出:

成功添加新手机:苹果 2023-09-22
成功添加新手机:华为 2023-09-25
已更新同款手机库存:苹果 2023-09-22,当前库存20
=== 手机库存清单 ===
1. 品牌:苹果 | 型号日期:2023-09-22 | 单价:5999.0元 | 库存:20台
2. 品牌:华为 | 型号日期:2023-09-25 | 单价:4999.0元 | 库存:18台

内容的提问来源于stack exchange,提问作者proxyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:25:42