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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:14