Python中向list类型dataclass追加元素实现购物车结构的正确语法
首先修正原有代码的错误
你现有代码存在几处逻辑问题,需要先调整才能实现需求:
- dataclass 可变类型默认值不能直接声明,否则会出现多个实例共享同一个列表/字典的问题,需要用
field(default_factory)声明 - Purchase类的
items字段标注为dict,默认值不能直接写ShoppingCart类对象,应该默认初始化为空字典 - 首次给ShoppingCart的item_id赋值时,你直接塞入单个Item实例,而非包含该实例的列表,后续无法执行追加操作
- 你想要的最终结构是Purchase实例包含多个ShoppingCart映射,应该操作
items字典,而非用getattr/setattr操作实例属性
修正后的dataclass定义
from dataclasses import dataclass, field from typing import List, Dict @dataclass class Item: price: int = 0 name: str = "" @dataclass class ShoppingCart: # 存储Item实例的列表,默认工厂生成空列表 item_id: List[Item] = field(default_factory=list) @dataclass class Purchase: # 键为购物车标识/实例,值为ShoppingCart实例 items: Dict[object, ShoppingCart] = field(default_factory=dict)
追加元素的正确语法
# inst_of_Purchase 是Purchase类实例 # inst_of_ShoppingCart 是对应的ShoppingCart标识/实例 # inst_of_Item 是要添加的Item类实例 target_cart = inst_of_Purchase.items.get(inst_of_ShoppingCart) if target_cart is None: # 购物车不存在,新建购物车并塞入第一个商品 new_cart = ShoppingCart() new_cart.item_id.append(inst_of_Item) inst_of_Purchase.items[inst_of_ShoppingCart] = new_cart else: # 已有购物车,直接往item_id列表追加商品即可 target_cart.item_id.append(inst_of_Item)
如果你确实需要用动态属性名存储购物车(而非items字典),追加写法如下:
# inst_of_ShoppingCart_attr_name 是购物车对应的属性名字符串 current_items = getattr(inst_of_Purchase, inst_of_ShoppingCart_attr_name) if current_items is None: # 首次赋值需要传入包含当前Item的列表 setattr(inst_of_Purchase, inst_of_ShoppingCart_attr_name, [inst_of_Item]) else: # 直接追加元素 current_items.append(inst_of_Item)
内容的提问来源于stack exchange,提问作者xtlc
相关产品推荐
相关产品推荐

