簡體   English   中英

如何在python中實現自己的自定義dict類

[英]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]為給定keyself上存儲一個項目並返回它:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM