锁定自定义字典
大家好,Python爱好者们,
我想创建一个自定义字典,主要有两个特点:
- 所有的键在创建时就要声明好
- 不能添加新的键或者修改现有的键(不过值还是可以修改的)
现在我的代码是这样的:
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()
方法,以避免删除键。