Skip to main content
 首页 » 编程设计

python之如何在python中实现自己的自定义字典类

2025年05月04日13cloudgamer

我正在学习 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'}