【发布时间】:2021-09-26 12:09:49
【问题描述】:
我有一个具有这种结构的数据类:
from dataclasses import dataclass
from typing import List
@dataclass
class PartData:
id: int = 0
name: str = None
value: int = 0
@dataclass
class StockData:
stock_1: List[PartData] = None
stock_2: List[PartData] = None
def __getitem__(self, key):
return super().__getattribute__(key)
现在我创建数据类并用项目填充它们:
PARTS = [{"id": 1, "name": "screw"}, {"id": 3, "name": "bolt"}, {"id": 42, "name": "glue"}, {"id": 11, "name": "nail"}, {"id": 31, "name": "hammer"}, {"id": 142, "name": "paper"}]
dc_stock = StockData()
for p in PARTS:
dc_part = PartData()
dc_part.id = p["id"]
if dc_part.id % 2 == 0:
dc_stock_list = "stock_1"
else:
dc_stock_list = "stock_2"
if getattr(dc_stock, dc_stock_list) == None:
setattr(dc_stock, dc_stock_list, [dc_part])
else:
dc_stock[dc_stock_list].append(dc_part)
print(dc_stock)
# StockData(stock_1=[PartData(id=42, name=None, value=0), PartData(id=142, name=None, value=0)],
# stock_2=[PartData(id=1, name=None, value=0), PartData(id=3, name=None, value=0), PartData(id=11, name=None, value=0), PartData(id=31, name=None, value=0)])
我知道我可以遍历所有项目并比较它们,但是我可以定义一个将part_id 作为参数的方法,并且可以使用新的part_id 更新dc_stock 中的任何项目value?这可以实现为StockData 的方法吗?假设我不知道零件是在stock_1 还是stock_2。
编辑
为了更好地理解我想分享我的方法,这对我来说看起来非常循环和昂贵:
@dataclass
class StockData:
stock_1: List[PartData] = None
stock_2: List[PartData] = None
def __getitem__(self, key):
return super().__getattribute__(key)
def update_part(self, id, value):
for stock_list in [f for f in fields(self) if f.name.startswith("stock")]:
stock = getattr(self, stock_list.name)
if len(stock) > 0:
for part in stock:
if part.id == id:
part.value = value
return None
print(dc_stock)
dc_stock.update_part(1, 10)
print(dc_stock)
【问题讨论】:
-
看起来
stock_1中只有偶数项,stock_2中只有奇数项 - 想知道这是故意的,还是仅用于演示目的。 -
只是表示该项目暂时不能在两者中。所以是的,只是演示。
-
我还用自己的方法更新了我的问题,以阐明我想要实现的目标。
-
你可能不想在这里使用
__getattribute__。我认为__getattr__就足够了。 -
是的,每个
id都是独一无二的。