微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决您可以使用 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 个),也许这将有助于我们了解您的具体情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?