You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 08:36:04