繁体   English   中英

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

[英]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

使用传统课程的方法是这样的。

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

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

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

像你想要的那样动态地设置属性不会给你带来太多好处,除了它可以减少输入来访问你的数据。

一种更好的方法是拥有定义明确的类,其中一看就会告诉您期望哪些属性并将您的 JSON 序列化/规范化到其中。 有一堆包。 例如 attrs 有cattrs 或者你只写一个 function 或 class 方法。

你花在明确这个转换上的时间,你会在以后调试时得到十倍的回报。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM