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
相关产品推荐
相关产品推荐

