问题描述
如果有一个看起来像这样的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 个),也许这将有助于我们了解您的具体情况。