如何在python中实现自己的自定义dict类

时间:2019-01-10 13:36:53

标签: python

我正在学习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对象中?我想念什么?

4 个答案:

答案 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}
>>>