dataclass是python3.7中自带的decorator,可以为customer class生成init function,同时支持以attribute形式获取class item。
For example:
@dataclass
class Point:
x: float
_: KW_ONLY
y: float
z: float
p = Point(0, y=1.5, z=2.0)
定义dataclass的约束有以下几点:1.所有field必须有annotation,本约束的原因将在后续内容说明 2. ‘non-default parameter follows default parameter’ rule,即有default的param必须在无default的之后。
同时,dataclass并不会依据annotation对field value类型做强约束,这一点与python function相同,即使声明字段为str,传入其他类型也不会报错。
首先通过分析dataclass实现原理,判断如何嵌入自定义内容。
原理很简单,dataclass为class生成了许多function,其中最主要的是 __init__,同时还包括__repr__, __eq__等,每个方法最后都通过_create_fn方法生成。在生成方法时需要得到field name,default,及locals等内容。
关于参数annotation和default的获取分为两步,首先通过`__annotations__`方法得到所有field的annotationdict,注意,此处获得的是有序的。而后,通过get class attribute方法得到所有field的default。使用这种方式要求每个field必须有annotation,原因为,假如class中存在一个field有default没有annotation,则__dict__能够拿到该值,__annotation__中没有该key,无法恢复class field原始的顺序,因而会对生成function造成