如何继承dict实现双向一对一映射类的__setitem__与__init__方法?
实现双向一对一映射的Dict子类
嘿,我帮你搞定了这个双向映射类的完整实现,完全贴合你的需求,咱们一步步拆解来看:
class Mapping(dict): def __init__(self, map_data=None): # 修正原代码的语法错误,处理空构造场景 if map_data is None: map_data = {} # 遍历传入字典,逐个调用__setitem__确保双向映射的正确性 for key, value in map_data.items(): self[key] = value def __setitem__(self, key1, key2): # 先清理已存在的冲突映射 # 如果key1已有对应值,移除它的双向映射 if key1 in self: old_val = self[key1] super().__delitem__(old_val) super().__delitem__(key1) # 如果key2已有对应值,同样移除它的双向映射 if key2 in self: old_key = self[key2] super().__delitem__(old_key) super().__delitem__(key2) # 避免key和value相同时重复添加 if key1 != key2: super().__setitem__(key1, key2) super().__setitem__(key2, key1) else: super().__setitem__(key1, key2)
关键逻辑说明:
- __init__方法修正:原代码里的
if Map = None是语法错误,改成if map_data is None更规范。通过遍历传入字典的键值对并调用__setitem__,能自动处理传入数据中的冲突,保证双向映射的一致性。 - __setitem__核心逻辑:
- 冲突清理:如果要设置的
key1或key2已经在映射里,先把它们原来的双向映射全部移除——比如key1之前对应old_val,就删掉key1:old_val和old_val:key1,防止残留无效映射。 - 双向添加:处理完冲突后,添加
key1:key2和key2:key1的双向映射;如果key1和key2是同一个值,只添加一次,避免字典里出现重复键。 - 复用父类方法:用
super()调用dict的原生方法,不破坏底层逻辑,只是在其基础上叠加双向映射规则。
- 冲突清理:如果要设置的
测试示例:
# 空构造测试 m1 = Mapping() m1["a"] = "b" print(m1) # 输出: {'a': 'b', 'b': 'a'} # 从字典构造测试(自动处理冲突) m2 = Mapping({"x": "y", "y": "z"}) print(m2) # 输出: {'x': 'y', 'y': 'x'}(原y:z被覆盖) # 覆盖已存在映射测试 m1["a"] = "c" print(m1) # 输出: {'a': 'c', 'c': 'a'}(原a:b和b:a已被移除)
内容的提问来源于stack exchange,提问作者Discrete
相关产品推荐
相关产品推荐

