如果想要更改字典的默认行为,需要更改哪些方法?
我所知道的一些方法,如__getitem__(), __missing__(), __iter__()
等。
我正在尝试以这样的方式实现字典:如果我尝试将值赋值给key(已经存在),那么旧值不应该消失,而应保留在某个列表中,当我们尝试删除像pop(key)这样的键,它应该删除旧的值。
需要修改哪些方法来覆盖dict类才能实现此行为?
答案 0 :(得分:1)
您要更新的是__setitem__
方法。您希望它在您的字典中设置新密钥时创建列表,并在密钥存在时附加到该列表。然后,您还可以扩展__getitem__
方法,以便在列表中获取所需项目的索引。至于pop
方法,您还需要覆盖dict.pop
。
class ListDict(dict):
def __setitem__(self, key, value):
if key not in self:
super().__setitem__(key, [])
self[key].append(value)
def __getitem__(self, item):
if isinstance(item, tuple):
item, pos = item
return super().__getitem__(item)[pos]
else:
return super().__getitem__(item)
def pop(self, k):
v = self[k].pop(0)
if not self[k]:
super().__delitem__(k)
return v
示例:
# Setting items
d = ListDict()
d['foo'] = 'bar'
d['foo'] = 'baz'
d # {'foo': ['bar', 'baz']}
# Getting items
d['foo', 0] # 'bar'
d['foo', 1] # 'baz'
d['foo', 0:2] # ['bar', 'baz']
# Popping a key
d.pop('foo')
d # {'foo': ['baz']}
d.pop('foo')
d # {}