我正在学习 python 类(class),并且正在尝试从 collections 模块创建我自己的 defaultdict 版本。这是我尝试过的:-
class Mydict(dict):
def __missing__(self, key):
self.key = []
return []
这是交互式 shell 的输出:-
>>> d = Mydict()
>>> d['x']
#outputs []
>>> d['x'].extend([1,2,3,4,5])
>>> print(d)
# Outputs {}
我不明白为什么它不在d 对象中存储 key x?我想念什么?
请您参考如下方法:
编辑:
获取返回的存储值而不是新列表:
In [143]: class Mydict(dict):
...: def __missing__(self, key):
...: self.__setitem__(key, [])
...: return self[key]
...:
In [144]: d = Mydict()
In [145]: d[2].extend([1, 2, 3])
In [146]: d[2]
Out[146]: [1, 2, 3]
dict 使用 __setitem__ 设置键值对,所以你需要使用它而不是设置属性:
In [113]: class Mydict(dict):
...: def __missing__(self, key):
...: self.__setitem__(key, [])
...: return []
...:
In [114]: d = Mydict()
In [115]: d[1]
Out[115]: []
In [116]: d
Out[116]: {1: []}
FWIW,您可以使用 d.__dict__ 或 vars(d) 通过常规方式获取您设置的属性字典:
In [117]: class Mydict(dict):
...: def __missing__(self, key):
...: self.__setattr__(key, 'foo')
...: self.__setitem__(key, 'bar')
...: return []
...:
In [118]: d = Mydict()
In [119]: d['x']
Out[119]: []
In [120]: d
Out[120]: {'x': 'bar'}
In [121]: vars(d)
Out[121]: {'x': 'foo'}
