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

如何在Python中创建键不可修改、值可修改的类dict对象?

实现不可新增键的类字典对象

你当前的实现继承自dict,但无法限制新增键。要实现允许修改已有键的值、禁止新增不存在的键的效果,需要重写字典的两个核心方法:__setitem__和update。

现有代码

class Result(dict):
    def __init__(self, a, b):
        self['a'] = a
        self['b'] = b

期望效果

x = Result(5, 4)
x['a'] = 15 # 允许修改值
x['c'] = 42 # 因键'c'不存在而抛出错误

解决方案代码

class Result(dict):
    def __init__(self, a, b):
        super().__init__()
        # 初始化时添加固定键
        self['a'] = a
        self['b'] = b

    def __setitem__(self, key, value):
        # 拦截赋值操作,检查键是否已存在
        if key not in self:
            raise KeyError(f"无法添加新键 '{key}'")
        # 键存在则调用父类方法修改值
        super().__setitem__(key, value)

    def update(self, other=None, **kwargs):
        # 重写update,避免通过该方法新增键
        items = []
        if other is not None:
            items.extend(other.items() if isinstance(other, dict) else other)
        items.extend(kwargs.items())
        
        # 逐个处理键值对,复用__setitem__的检查逻辑
        for key, value in items:
            self[key] = value

代码说明

  • __setitem__:对应obj[key] = value的赋值语法,重写后会先检查键是否存在,不存在则抛出KeyError,存在则正常修改值。
  • update:默认的update方法允许新增键,重写后将所有传入的键值对通过self[key] = value处理,自动触发__setitem__的检查逻辑,避免新增键。
  • 初始化时调用super().__init__()确保父类字典的正常初始化,再添加固定的初始键。

测试验证

x = Result(5, 4)
x['a'] = 15  # 正常执行,x['a']变为15
print(x)  # 输出: {'a': 15, 'b': 4}

x['c'] = 42  # 抛出 KeyError: 无法添加新键 'c'

# 测试update方法
x.update({'a': 20})  # 正常修改
print(x)  # 输出: {'a': 20, 'b': 4}

x.update(c=30)  # 抛出 KeyError: 无法添加新键 'c'

内容的提问来源于stack exchange,提问作者rmoreno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:31:14