DataClass 对象列表的字典 GET 方法 - 在 DataClass 列表中查找具有特定变量值的 DataClass

dictionary get method for list of dataclass objects - find dataclass with specific variable value in list of dataclasses

提问人:Schradt 提问时间:11/3/2023 更新时间:11/3/2023 访问量:39

问:

###It 在我看来,找到数据类对象的方法必须比遍历所有对象以查找特定对象更好。

#My way, that I hope to improve:
def changeValueOf(primaryKey):
    for item in self.addlist:
        if item.id == primaryKey:
            # Do stuff...


#Basics:
listOfKeys = "AA BB CC".split()

@dataclass
class Feld:
    id: str
    value1: str
    value2: str
    value3: str

self.addlist: List = []

for element in Daten:
    data = Feld(element[0], element[1], element[2], int(element[3]))
    self.addlist.append(data)
python-3.x python-data类

评论

0赞 DeepSpace 11/3/2023
为什么是列表而不是字典?addlistid
0赞 DeepSpace 11/3/2023
此外,成为班级的一员也没有多大意义。addlist
0赞 Chukwujiobi Canon 11/3/2023
@DeepSpace类实例的操作会改变类实例🤷 ♂️可能是有原因的
0赞 Chukwujiobi Canon 11/3/2023
这个问题需要更多的关注。考虑编辑它
0赞 DeepSpace 11/3/2023
@ChukwujiobiCanon确实如此,但这不是OP试图做的事情。

答:

0赞 blhsing 11/3/2023 #1

跟踪类的所有实例的一种常见且有效的方法是将每个实例存储在某个键的字典的类变量中,并使用类方法通过键检索实例。在您的情况下,请使用该属性作为键:id

from typing import ClassVar
from dataclasses import dataclass

@dataclass
class Feld:
    _id_to_instance: ClassVar[dict] = {}
    id: str
    value: str

    def __post_init__(self):
        self._id_to_instance[self.id] = self

    @classmethod
    def get_instance_by_id(cls, id):
        return cls._id_to_instance[id]

因此:

for id, value in ('id1', 'value1'), ('id2', 'value2'):
    Feld(id, value)

print(Feld.get_instance_by_id('id2'))

输出:

Feld(id='id2', value='value2')

演示:https://ideone.com/KgQH5y

评论

0赞 Schradt 11/3/2023
听起来很有希望,但不能解决我的要求。我终于访问了 Feld 类的列表。该列表没有方法 get_instance_by_id(),我无法向单个类询问列表中是否存在其他类 - 或者我错了?!
0赞 Schradt 11/3/2023
我错了....我只需访问 self.addlist[0].get_instance_by_id('Datum'),我就会得到我需要的列表元素。完善!感谢您的帮助。我刚接触 Python 几个星期。