【发布时间】:2021-01-10 03:29:30
【问题描述】:
背景
我正在使用数据类来创建嵌套数据结构,我用它来表示复杂的测试输出。
以前我一直通过创建多个顶级数据类然后使用组合来创建层次结构:
from dataclasses import dataclass
@dataclass
class Meta:
color: str
size: float
@dataclass
class Point:
x: float
y: float
stuff: Meta
point1 = Point(x=5, y=-5, stuff=Meta(color='blue', size=20))
问题
我想知道是否有一种方法可以以自包含的方式定义类,而不是用一堆低级别的类来污染我的顶层。
所以上面Point数据类的定义包含Meta的定义,而不是顶层的定义。
解决方案?
我想知道是否可以将内部(数据类)类与数据类一起使用并让一切正常工作。
所以我尝试了这个:
rom dataclasses import dataclass
from typing import get_type_hints
@dataclass
class Point:
@dataclass
class Meta:
color: str
size: float
@dataclass
class Misc:
elemA: bool
elemB: int
x: float
y: float
meta: Meta
misc: Misc
point1 = Point(x=1, y=2,
meta=Point.Meta(color='red', size=5.5),
misc=Point.Misc(elemA=True, elemB=-100))
print("This is the point:", point1)
print(point1.x)
print(point1.y)
print(point1.meta)
print(point1.misc)
print(point1.meta.color)
print(point1.misc.elemB)
point1.misc.elemB = 99
print(point1)
print(point1.misc.elemB)
这一切似乎都可以正常工作 - 打印输出都可以正常工作,并且对(子)成员元素的分配也可以正常工作。
您甚至可以支持嵌套元素的默认设置:
from dataclasses import dataclass
@dataclass
class Point:
@dataclass
class Meta:
color: str = 'red'
size: float = 10.0
x: float
y: float
meta: Meta = Meta()
pt2 = Point(x=10, y=20)
print('pt2', pt2)
...正确打印出red 和10.0 pt2 的默认值
问题
这是实现嵌套数据类的正确方法吗?
(这意味着它现在工作并不幸运,但将来可能会崩溃?...或者它只是丑陋而不是你如何做事?...或者它只是坏?)
...它肯定比组合在一起的大量顶级“迷你”数据类更简洁,更容易理解和支持一百万倍。
...这也比尝试使用 marshmellow 或 jerry 将 json 模式绑定到类结构模型要容易得多。
...也很简单(我喜欢)
【问题讨论】:
标签: python-3.7 python-dataclasses python-class