[英]How to implement own custom dict class in python
我正在學習python中的類,並且在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 {}
我不明白為什么它不將鍵x
存儲在d
對象中? 我想念什么?
編輯:
要獲取返回的存儲值而不是新列表:
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'}
您正在創建屬性而不是項目 :
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]
為給定key
在self
上存儲一個項目並返回它:
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]}
self.key = []
行沒有執行您認為的操作。 您想要的是在dict上添加一個項目,但是實際要做的是在Mydict實例中創建一個名為key
的新屬性,並為其賦予值[]
。 看到這個
>>> d = Mydict()
>>> d['x']
[]
>>> d.key
[]
這將達到您的期望:
class Mydict(dict):
def __missing__(self, key):
self.__setitem__(key,[])
return []
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}
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.