Python中如何为支持__getitem__的对象实现按键删除功能
实现
del myDict[key]语法的方案 你混淆了两个功能完全独立的魔法方法:
__del__:仅在实例对象被垃圾回收时触发,用于整个对象的资源清理,和按下标删除元素的逻辑无关__delitem__:Python中del obj[key]语法对应的专属魔法方法,接收self和key两个入参,就是你需要实现的接口
示例实现
class MyHashDict: def __init__(self): # 此处可替换为你自己的哈希表底层存储逻辑 self._hash_slots = [None] * 1024 def __setitem__(self, key, value): # 配套实现 myDict[key] = value 赋值语法,用于测试 hash_idx = hash(key) % len(self._hash_slots) self._hash_slots[hash_idx] = (key, value) def __getitem__(self, key): # 配套实现 myDict[key] 取值语法,用于测试 hash_idx = hash(key) % len(self._hash_slots) slot_val = self._hash_slots[hash_idx] if slot_val is None or slot_val[0] != key: raise KeyError(key) return slot_val[1] def __delitem__(self, key): # 核心:del myDict[key] 逻辑实现 hash_idx = hash(key) % len(self._hash_slots) slot_val = self._hash_slots[hash_idx] # 和原生dict行为对齐,key不存在时抛出KeyError if slot_val is None or slot_val[0] != key: raise KeyError(key) # 标记对应槽位为空,你也可以根据自己的哈希表冲突处理逻辑调整删除逻辑 self._hash_slots[hash_idx] = None
测试验证
my_dict = MyHashDict() my_dict["test"] = "hello world" print(my_dict["test"]) # 输出 hello world del my_dict["test"] print(my_dict["test"]) # 触发 KeyError: 'test',符合预期
注意事项
- 你可以根据自己的哈希表冲突处理方案(比如开放寻址、链式哈希)调整
__delitem__内的删除逻辑,不需要和示例完全一致 - 不需要修改
__del__方法的实现,它和下标删除功能没有任何关联
内容的提问来源于stack exchange,提问作者Peppershaker
相关产品推荐
相关产品推荐

