继承order1父类属性触发NameError,求实现显示订单列表的正确方案
问题解决与正确实现方案
错误分析
- NameError 直接诱因:子类主程序里的
print(test.self.members)写法错误,self是类内部方法中指代当前实例的关键字,外部访问实例属性直接用实例名.属性名,即test.members。 - 子类未继承父类初始化逻辑:
card类继承order1但未在__init__中调用super().__init__(),导致父类的members属性未被初始化,同时父类__init__需要type和quantity参数,直接实例化card()会触发参数缺失错误。 - 父类属性拼写错误:
@property定义的quantite是笔误,应和初始化的_quantity对应,改为quantity。 - 订单重复判断逻辑无效:
add_order方法里if type not in self.members的判断不成立,因为members存储的是order1实例而非字符串类型,需遍历实例的type属性判断是否已存在。
修正后的父类代码(order.py)
class order1: def __init__(self, type: str, quantity: int) -> None: self._type = type self._quantity = quantity self.members = [] def __str__(self) -> str: return f'{self._type},{self._quantity}' def add_order(self, type, quantity) -> None: # 检查是否已有相同type的订单 exists = any(order.type == type for order in self.members) if not exists: order = order1(type, quantity) self.members.append(order) else: print('type already exist') @property def type(self) -> str: return self._type @type.setter def type(self, type) -> None: self._type = type @property def quantity(self) -> int: return self._quantity @quantity.setter def quantity(self, quantity) -> None: self._quantity = quantity if __name__ == '__main__': test = order1("nokia22", 1233) test.add_order("nokia22", 123) # 会提示type already exist test.add_order("iphone14", 456) print(test) # 打印订单列表 for order in test.members: print(order)
修正后的子类代码(card.py)
from order import order1 class card(order1): def __init__(self, type: str, quantity: int) -> None: # 调用父类构造方法,初始化父类属性 super().__init__(type, quantity) self.members1 = [] def __str__(self) -> str: # 格式化输出订单列表 return '||'.join(str(x) for x in self.members) if __name__ == '__main__': # 实例化子类时传入父类所需的type和quantity参数 test_card = card("xiaomi13", 789) # 添加测试订单 test_card.add_order("xiaomi13", 100) test_card.add_order("huaweiMate60", 200) # 打印订单列表 print("订单列表:") print(test_card) # 直接访问members属性打印 print("\n直接访问members:") for order in test_card.members: print(order)
关键修正点说明
- 子类
card的__init__必须调用super().__init__(type, quantity),确保父类的members等属性被正确初始化。 - 修正父类中
quantite的拼写错误,统一为quantity,避免属性访问异常。 - 修复
add_order中的重复判断逻辑,使用any()遍历实例的type属性来检测重复。 - 外部访问实例属性时,去掉多余的
self,直接用实例名.属性名。
内容的提问来源于stack exchange,提问作者eve
相关产品推荐
相关产品推荐

