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

如何在继承dict的Python类中处理保留关键字的属性初始化与读写

解决方案

推荐通过重写属性访问的魔法方法实现动态字段映射,既不需要预处理输入数据,也不会破坏dict本身的可迭代性、原生方法等特性。

实现代码

class Transaction(dict):
    # 字段别名映射:key为要使用的属性名,value为字典中对应的原始键
    _field_alias = {
        "sender": "from"
    }

    def __getattr__(self, item):
        # 访问属性时先判断是否是别名
        if item in self._field_alias:
            return self.get(self._field_alias[item])
        return super().get(item)

    def __setattr__(self, key, value):
        # 给别名属性赋值时同步修改对应原始键
        if key in self._field_alias:
            self[self._field_alias[key]] = value
            return
        super().__setitem__(key, value)

    def __delattr__(self, item):
        # 删除别名属性时同步删除对应原始键
        if item in self._field_alias:
            del self[self._field_alias[item]]
            return
        super().__delitem__(item)

使用示例

# 直接传入原始数据,无需提前预处理
transaction = Transaction({"to": "0x000", "from": "0x001", "timestamp": 1234})

# 正常通过别名访问
print(transaction.sender) # 输出:0x001
# 原字典键也可正常使用
print(transaction["from"]) # 输出:0x001

# 修改别名会同步更新原键值
transaction.sender = "0x999"
print(transaction["from"]) # 输出:0x999

# 完全保留字典原生特性,可正常迭代
for key, val in transaction.items():
    print(f"{key}: {val}")
# 输出结果:
# to: 0x000
# from: 0x999
# timestamp: 1234

方案优势

  1. 无数据冗余:别名是动态映射的,不会在字典中额外生成sender字段,迭代、序列化时不会出现多余字段
  2. 数据完全同步:无论修改sender属性还是修改from字典键,两边取值始终一致
  3. 扩展性强:需要新增其他别名时,直接在_field_alias字典中添加对应映射即可,无需修改逻辑代码
  4. 兼容性好:完全保留dict的所有原生方法和特性,原有使用逻辑不需要做任何调整

内容的提问来源于stack exchange,提问作者Chipe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:39:03