锁定自定义字典

2 投票
3 回答
749 浏览
提问于 2025-04-15 13:31

大家好,Python爱好者们,

我想创建一个自定义字典,主要有两个特点:

  1. 所有的键在创建时就要声明好
  2. 不能添加新的键或者修改现有的键(不过值还是可以修改的)

现在我的代码是这样的:

class pick(dict):
   """This will make delicious toffee when finished"""
   def __init__(self, *args):
       dict.__init__(self)
       for arg in args:
           self[arg] = None

任何帮助都非常感谢。

更新:

虽然我找到了想要的解决方案,但有一个问题:

字典在初始化时调用了 __setitem__ 来添加项目,但找不到键时就会报错。

cupboard = pick('milk')  #raises error

更新1:

问题都解决了,非常感谢大家。

3 个回答

2

我建议你使用委托,而不是继承。
如果你选择继承,那么字典(dict)之前的所有方法都会被继承过来,但这些方法的表现可能和你预想的不一样,这样就会破坏你对这个类的假设,而且这一切都是悄悄发生的。

而如果你使用委托,你就可以完全控制你提供的方法。如果你在一个需要某个你没有实现的方法的地方使用你的字典,你会得到一个错误提示,这样能快速让你发现问题。

2

像这样

class UniqueDict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)

    def __setitem__(self, name, value):
        if name not in self:
            raise KeyError("%s not present")
        dict.__setitem__(self, name, value)
12

重写 __setitem__ 方法,让它按照你想要的方式工作。你可以调用 dict.__setitem__(self, key, value) 来修改基础字典,这样就不用经过你自己定义的逻辑了。

class ImmutableDict(dict):
    def __setitem__(self, key, value):
        if key not in self:
             raise KeyError("Immutable dict")
        dict.__setitem__(self, key, value)

d = ImmutableDict(foo=1, bar=2)
d['foo'] = 3
print(d)
d['baz'] = 4 # Raises error

你还需要重写 dict.update()setdefault() 方法,以避免添加新的键。同时,可能还需要重写 dict.__delitem__()dict.clear()dict.pop()dict.popitem() 方法,以避免删除键。

撰写回答