Python OOP继承问题:Magasin子类调用add_phone报TypeError求助
问题分析与修复方案
先梳理你代码里的几个核心问题,逐个修正后就能正常运行:
错误原因汇总
- 继承逻辑错误:Magasin是商店,应该是包含多个phone1实例,不是继承phone1(继承是"是一个"的关系,商店不可能是手机)
- 方法定义错误:
add_phone没有作为Magasin类的方法,缩进错误导致变成全局函数,调用时缺少self参数 - 实例化参数混乱:创建phone1时参数顺序完全错误,还多传了多余的self
- Setter方法名错误:phone1里price和quantity的setter方法名写成了
name,完全不对应 - 类型注释矛盾:phone1的model属性,__init__里定义是datetime,但@property返回注释是int,和你实际传入的年份(int)不匹配
修复后的完整代码
父类phone1(修正setter和类型注释)
from datetime import datetime class phone1: def __init__(self, brand: str, model: int, price: float, quantity: int) -> None: self._brand = brand self._model = model self._price = price self._quantity = quantity def __str__(self) -> str: return f'{self._brand},{self._model},{self._price},{self._quantity}' @property def brand(self) -> str: return self._brand @brand.setter def brand(self, brand) -> None: self._brand = brand @property def model(self) -> int: return self._model @model.setter def model(self, model) -> None: self._model = model @property def price(self) -> float: return self._price # 修正setter方法名为price @price.setter def price(self, price) -> None: self._price = price @property def quantity(self) -> int: return self._quantity # 修正setter方法名为quantity @quantity.setter def quantity(self, quantity) -> None: self._quantity = quantity
子类Magasin(修正继承、方法定义和参数)
from datetime import datetime from phone import phone1 class Magasin: # 去掉不必要的继承 def __init__(self): self.members = [] # 存储手机实例的列表 # 缩进正确,作为类的方法 def add_phone(self, brand, model, price, quantity): # 按phone1的__init__参数顺序传值,不要多余的self phone = phone1(brand, model, price, quantity) self.members.append(phone) return phone # 实现display方法,显示所有手机 def display(self): print("商店中的手机列表:") for idx, phone in enumerate(self.members, 1): print(f"{idx}. {phone}") # 可选:给Magasin添加__str__方法,方便打印实例 def __str__(self) -> str: return f"Magasin实例,包含{len(self.members)}台手机" if __name__ == '__main__': # 先创建商店实例 test = Magasin() # 调用实例的add_phone方法添加手机 test.add_phone("nokia22", datetime.now().year, 1266.344, 190) # 调用display显示列表 test.display() # 打印商店实例 print(test)
关键修复说明
- 移除错误继承:Magasin不再继承phone1,因为两者是包含关系,不是"是一个"的关系
- 修正方法归属:
add_phone缩进后成为Magasin的成员方法,调用时通过实例调用,self会自动传入 - 参数顺序修正:创建phone1时严格按照
brand, model, price, quantity的顺序传参,去掉多余的self - 修复Setter方法:price和quantity的setter方法名改为对应属性名,保证property功能正常
- 统一类型注释:phone1的model属性改为int类型,和你实际传入的年份(datetime.now().year)匹配
- 添加display方法:实现你要求的显示手机列表功能
- 修正调用逻辑:先创建商店实例,再调用add_phone添加手机,符合面向对象的使用逻辑
现在运行代码,就能正常添加手机并显示列表了。
内容的提问来源于stack exchange,提问作者proxy
相关产品推荐
相关产品推荐

