Python:如何禁止在AttrDict中创建新键?
实现支持属性修改但禁止新增键的AttrDict
没问题,我们可以通过重写__setattr__方法来实现这个需求——允许修改已有键的属性值,但禁止创建新键,尝试新增时直接抛出错误。这里是改进后的代码:
class AttrDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__dict__ = self def __setattr__(self, name, value): # 检查目标键是否已存在于字典中 if name not in self: raise AttributeError(f"Cannot add new key '{name}' to AttrDict") # 若键存在,执行正常的属性赋值逻辑 super().__setattr__(name, value)
原理说明
原AttrDict通过把self.__dict__指向自身,实现了属性与字典键的映射。我们重写__setattr__方法后,每次通过属性赋值时都会触发这个方法:
- 先判断要赋值的属性名是否对应字典中已存在的键
- 如果不存在,直接抛出
AttributeError阻止新增操作 - 如果存在,就调用父类的
__setattr__完成正常赋值
用法示例
# 初始化AttrDict实例 d = AttrDict({'a':1, 'b':2}) print(d) # 输出: {'a': 1, 'b': 2} # 修改已有键,操作正常执行 d.b = 10 print(d) # 输出: {'a': 1, 'b': 10} # 尝试创建新键,触发异常 try: d.c = 4 except AttributeError as e: print(e) # 输出: Cannot add new key 'c' to AttrDict
这样既保留了原AttrDict通过属性访问键值对的便利性,又严格限制了新增键的操作,完全符合你的需求。
内容的提问来源于stack exchange,提问作者mrgloom
相关产品推荐
相关产品推荐

