Python Dataclasses继承中属性覆盖失败问题问询
Python Dataclasses子类覆盖属性的行为解析
这是dataclasses的预期行为,并非bug。核心原因在于dataclass装饰器的字段识别规则:只有带类型注解的属性才会被当作dataclass的字段处理,没有类型注解的只是普通类属性,两者的优先级和处理逻辑完全不同。
示例1解析
父类base中的x: str = "parent"是带类型注解的dataclass字段,会被装饰器纳入字段管理体系。而子类child中的x = "child"没有类型注解,属于普通类属性,不会被dataclass识别为字段。当实例化child时,dataclass会优先遵循父类的字段定义逻辑,因此最终输出parent。
代码示例:
from dataclasses import dataclass @dataclass class base: x: str = "parent" @dataclass class child(base): x = "child" config = child() print(config.x) # --> parent
示例2解析
父类base中的x = "parent"是普通类属性,未被dataclass标记为字段。子类child中的x: str = "child"带有类型注解,会被dataclass识别为子类的字段,此时子类的字段定义会覆盖父类的普通属性,因此实例化后输出child。
代码示例:
from dataclasses import dataclass @dataclass class base: x = "parent" @dataclass class child(base): x: str = "child" config = child() print(config.x) # --> child
正确覆盖字段的方式
如果要在子类中覆盖父类的dataclass字段,必须保持带类型注解的定义方式,和父类的字段声明规则一致。比如:
from dataclasses import dataclass @dataclass class base: x: str = "parent" @dataclass class child(base): x: str = "child" # 保留类型注解,作为dataclass字段覆盖父类 config = child() print(config.x) # --> child
内容的提问来源于stack exchange,提问作者jigyasu nayyar
相关产品推荐
相关产品推荐

