美好的一天蟒蛇,
我想制作一个包含两个主要功能的自定义词典:
现在代码就是这样:
class pick(dict):
"""This will make delicious toffee when finished"""
def __init__(self, *args):
dict.__init__(self)
for arg in args:
self[arg] = None
非常感谢任何帮助。
UPD:
虽然我正在寻找解决方案但有一个问题:
字典调用__setitem__
在初始化时添加项目,而不是找到引发错误的键。
cupboard = pick('milk') #raises error
upd1:
全部解决了,非常感谢。
答案 0 :(得分: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()
以避免删除密钥。
答案 1 :(得分: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)
答案 2 :(得分:2)
我建议您使用委托,而不是继承。 如果继承,dict的所有先前方法都将被继承,但它们可以按照您的预期行为,从而破坏您对类的假设,并以静默方式执行。
如果你做了委托,你可以完全控制你提供的方法,如果你试图在需要你没有实现的方法的上下文中使用你的dict,你将得到一个例外,快速解决问题。