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

继承order1父类属性触发NameError,求实现显示订单列表的正确方案

问题解决与正确实现方案

错误分析

  1. NameError 直接诱因:子类主程序里的print(test.self.members)写法错误,self是类内部方法中指代当前实例的关键字,外部访问实例属性直接用实例名.属性名,即test.members。
  2. 子类未继承父类初始化逻辑:card类继承order1但未在__init__中调用super().__init__(),导致父类的members属性未被初始化,同时父类__init__需要type和quantity参数,直接实例化card()会触发参数缺失错误。
  3. 父类属性拼写错误:@property定义的quantite是笔误,应和初始化的_quantity对应,改为quantity。
  4. 订单重复判断逻辑无效: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:37:43