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

问题描述

如果有一个看起来像这样的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)

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

解决方法

attrs 等人的重点是为您的数据定义明确的类。因此,对您的问题的简短回答是“否”。

像您想要的那样动态设置属性不会给您带来太多好处,只是可以减少访问数据的输入次数。

更好的方法是拥有定义明确的类,其中一个外观会告诉您期望的属性并将您的 JSON 序列化/规范化到其中。有很多软件包可以做到这一点;例如,对于 attrs 有 cattrs。或者你只是写一个函数或类方法。

您花费的时间使这种转换显式化,以后调试时您会得到十倍的回报。

,

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...