如何实现Python Dataclasses允许修改已有字段但禁止新增字段?
实现允许修改已有字段但禁止新增字段的Dataclass
要实现这个需求,我们可以通过重写类的__setattr__方法来控制属性赋值逻辑:只允许对dataclass预先定义的字段进行修改,对新增字段的赋值操作抛出错误。具体实现如下:
示例代码
from dataclasses import dataclass, fields @dataclass class Foo: bar: int baz: int def __setattr__(self, name: str, value) -> None: # 获取当前dataclass的所有预定义字段名 field_names = {field.name for field in fields(self)} if name not in field_names: raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") # 调用父类方法完成已有字段的正常赋值 super().__setattr__(name, value) # 测试验证 foo = Foo(bar=1, baz=0) foo.baz = 2 # 正常执行,允许修改已有字段 print(foo.baz) # 输出: 2 foo.qux = 'hey' # 触发错误: AttributeError: 'Foo' object has no attribute 'qux'
逻辑说明
dataclass默认的__setattr__不限制新增字段,重写该方法可以添加校验规则。- 使用
fields(self)获取当前类的所有预定义字段集合,通过字段名判断赋值操作是否合法。 - 调用
super().__setattr__保证已有字段的修改逻辑和原生dataclass一致,避免手动实现赋值带来的潜在问题。
内容的提问来源于stack exchange,提问作者tyson.wu
相关产品推荐
相关产品推荐

