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

2024-09-27 09:23:23 发布

您现在位置:Python中文网/ 问答频道 /正文

如果有这样一个json数据集

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

需要将其转换为一组对象,在这些对象中,可以使用相同的类定义这些对象

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

但是属性可以通过点表示法访问,如下所示

charizard.a
pikachu.d
squirtle.a

在传统的课堂上这样做的方法是这样的

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

有没有一种方法可以对namedtuples或DataClass或Attr执行基本相同的操作,它们可以处理不同大小的数据,并具有这些数据类型的所有良好的不变性、repr等功能


Tags: 数据对象方法selfjsondatatypefire
2条回答

对架构中的数据使用attrs。如果您的数据确实有一个模式(即使它包含很多属性),那么您可以使用attrs,甚至可以动态定义数据模式。但如果您的数据是无模式的,则不要在其上定义模式

如果你能举几个真实的例子(至少10个),也许这会帮助我们了解你的确切情况

attrs等人的要点是为数据定义良好的类。所以对你的问题的简短回答是“不”

像您希望的那样动态设置属性不会给您带来太多好处,只不过它可以减少访问数据的输入

更好的方法是使用定义良好的类,其中一个外观可以告诉您需要哪些属性,并将JSON序列化/规范化到其中。有一大堆的包装;例如,对于属性有cattrs。或者只编写一个函数或类方法

您花在显式转换上的时间,在以后调试时会增加十倍

相关问题 更多 >

    热门问题