您可以使用 namedtuples/dataclass/attrs 来创建灵活大小的 class 还是必须使用传统的 classes?

Can you use namedtuples/dataclass/attrs to create a flexible sized class or do you have to use traditional classes?

如果有json这样的数据集

[
{'a':1,'b':'fire','c':'cambodia','type':'charizard'},
{'a':2,'d':'waterparks','type':'squirtle'},
{'a':3,'f':'thunder','type':'pikachu'}
]

并且需要将其转换为一组对象,其中对象可以像这样用相同的class定义。

charizard = Pokemon(row_data)
pickachu = Pokemon(row_data)
squirtle = Pokemon(row_data)

但是属性可以通过点符号访问,就像这样。

charizard.a
pikachu.d
squirtle.a

使用传统 classes 的方法是这样的。

class Pokemon(object):
    def __init__(self, data):
        for k, v in data.items():
            setattr(self, k, v)

有没有一种方法可以对 namedtuples 或 dataclasses 或 attrs 做基本相同的事情,它们适用于不同大小的数据,并具有这些数据的所有良好的不变性、repr 等功能类型。

attrs 等人的要点是为您的数据定义明确的 classes。所以对你的问题的简短回答是“不”。

随心所欲地动态设置属性不会给您带来太多好处,只是访问数据的输入更少。

更好的方法是定义明确的 classes,一看就会告诉您预期的属性,serialize/normalize 您的 JSON 就知道了。有很多软件包;例如,对于 attrs,有 cattrs。或者你只是写一个函数或 class 方法。

显式转换所花费的时间,稍后调试时会得到十倍的回报。

对具有架构的数据使用 attrs。如果您的数据确实有模式(即使它包含大量属性),是的,您可以使用 attrs,甚至可以动态定义数据模式。但是,如果您的数据是无模式的,请不要在其上定义模式。

如果您能举几个真实的例子(至少 10 个),也许这将有助于我们了解您的具体情况。