如何在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
相关产品推荐
相关产品推荐

