Python dataclass继承中的异常行为解析求助
Python Dataclass继承中无类型注解属性的异常行为原因分析
先复现你遇到的问题代码:
>>> @dataclass ... class Base: ... a: int = 10 ... >>> >>> @dataclass ... class Derived(Base): ... a = 20 ... >>> >>> Derived.a 20 >>> Derived().a 10
本质原因可以从以下几点拆解:
- Dataclass的字段识别逻辑:
@dataclass装饰器仅将带有类型注解的类属性认定为dataclass的字段,这些字段会参与生成__init__、__eq__等核心方法。Derived类中的a = 20没有类型注解,因此不会被dataclass识别为字段,只是一个普通的类属性。 - 类属性与实例字段的访问优先级:Base类中的
a: int = 10是标准的dataclass字段,在实例化Derived时,dataclass自动生成的__init__方法会优先处理父类的字段,给实例的a赋值为10。而Derived的类属性a=20仅存在于类层级,实例访问a时会优先读取自身实例字段的值,因此出现类访问是20、实例访问是10的差异。 - 添加类型注解后的修复逻辑:当给Derived的
a加上类型注解后,@dataclass会将其识别为Derived的字段,覆盖父类的同名字段。此时生成的__init__方法会使用Derived中a的默认值20来初始化实例,所以类和实例访问a的结果会一致。
内容的提问来源于stack exchange,提问作者skgbanga
相关产品推荐
相关产品推荐

