我正在学习python中的类,并且在defaultdict
模块中创建自己的collections
版本。这是我尝试过的:-
class Mydict(dict):
def __missing__(self, key):
self.key = []
return []
这是交互式外壳程序的输出:-
>>> d = Mydict()
>>> d['x']
#outputs []
>>> d['x'].extend([1,2,3,4,5])
>>> print(d)
# Outputs {}
我不明白为什么它不将密钥x
存储在d
对象中?我想念什么?
答案 0 :(得分:3)
编辑:
要获取返回的存储值而不是新列表:
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)
来获取通过常规方式设置的属性dict:
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'}
答案 1 :(得分:2)
您正在创建一个属性而不是一个 item :
self.key = [] # attribute named key
self[key] = bar # item stored for key
您也不会返回存储在self
上的列表,而是创建并返回另一个列表:
return [] # return a new list
return self[key] # return the stored list
在您的__missing__
方法中,使用self[key]
将给定self
的项目存储在key
上并返回:
class Mydict(dict):
def __missing__(self, key):
self[key] = new_item = [] # create and store a new list
return new_item # return the newly created list
这确保您可以直接修改新添加的项目:
>>> d = Mydict()
>>> d['x']
[]
>>> d['x'].extend([1,2,3,4,5])
>>> d
{'x': [1, 2, 3, 4, 5]}
答案 2 :(得分:1)
第self.key = []
行没有执行您认为的操作。您想要的是将一个项目添加到dict,但是实际要做的是创建Mydict实例的一个新属性,称为key
,并为其赋予值[]
。要查看此
>>> d = Mydict()
>>> d['x']
[]
>>> d.key
[]
这将满足您的期望:
class Mydict(dict):
def __missing__(self, key):
self.__setitem__(key,[])
return []
答案 3 :(得分:-1)
dict用于键值对,并使用update来添加值
>>> d = Mydict()
>>> d.update({ "a" : 1, "b" : 2 })
>>> d
{'a': 1, 'b': 2}
>>> d.update({ "c" : 3, "d" : 4 })
>>> d
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
>>>