Python中继承dict实现嵌套Pointer_dict的__getitem__与__repr__方法问题
实现Pointer_dict子类解决方案
要解决嵌套字典的显示与修改问题,核心是让Pointer_dict在处理嵌套结构时自动递归包装,同时在打印时合并原字典与自身的修改内容。以下是完整实现:
class Pointer_dict(dict): def __init__(self, origin=None, **kwargs): super().__init__(**kwargs) self.origin = origin or {} def __getitem__(self, key): # 优先返回自身已覆盖的键值 if key in self: value = super().__getitem__(key) # 嵌套字典自动包装为Pointer_dict,绑定对应原字典的子结构 if isinstance(value, dict) and isinstance(self.origin.get(key), dict): return Pointer_dict(origin=self.origin[key], **value) return value # 自身无对应键时从原字典获取 if key not in self.origin: raise KeyError(key) value = self.origin[key] # 原字典的子字典自动包装为Pointer_dict,方便后续修改 if isinstance(value, dict): return Pointer_dict(origin=value) return value def __repr__(self): # 递归合并原字典与自身内容,生成符合预期的打印格式 def merge(obj): if isinstance(obj, Pointer_dict): merged = obj.origin.copy() merged.update(obj) # 递归处理嵌套的Pointer_dict for k, v in merged.items(): merged[k] = merge(v) return repr(merged) elif isinstance(obj, dict): return repr(obj) else: return repr(obj) return merge(self)
测试验证
# 基础场景测试 original = { 'foo': 1, 'bar': 2 } pointer_dict = Pointer_dict(origin=original) print(pointer_dict['foo']) # 输出 1 pointer_dict['foo'] = 10 print(pointer_dict['foo']) # 输出 10 print(original['foo']) # 输出 1 # 嵌套场景测试 original = { 'foo': 1, 'bar': { 'foobar': 2, 'barfoo': 3 } } pointer_dict = Pointer_dict(origin=original) print(pointer_dict['foo']) # 输出 1 pointer_dict['bar']['foobar'] = 10 print(pointer_dict['bar']['foobar']) # 输出 10 print(original['bar']['foobar']) # 输出 2 # 打印验证 print(pointer_dict) # 输出 {'foo': 1, 'bar': {'foobar': 10, 'barfoo': 3}} print(pointer_dict['bar']) # 输出 {'foobar': 10, 'barfoo': 3}
关键逻辑说明
- __getitem__方法:
- 优先返回自身已修改的键值,遇到嵌套字典时自动包装为
Pointer_dict,绑定原字典对应子结构,确保后续修改仅记录在当前实例中,不影响原字典。 - 未修改的键直接引用原字典的值,节省内存开销。
- 优先返回自身已修改的键值,遇到嵌套字典时自动包装为
- __repr__方法:
- 通过递归函数合并原字典与当前实例的键值对,将嵌套的
Pointer_dict转换为普通字典格式输出,同时保留所有修改内容与原字典未修改的部分。
- 通过递归函数合并原字典与当前实例的键值对,将嵌套的
内容的提问来源于stack exchange,提问作者Xian
相关产品推荐
相关产品推荐

