You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:57:16