如何在继承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
方案优势
- 无数据冗余:别名是动态映射的,不会在字典中额外生成
sender字段,迭代、序列化时不会出现多余字段 - 数据完全同步:无论修改
sender属性还是修改from字典键,两边取值始终一致 - 扩展性强:需要新增其他别名时,直接在
_field_alias字典中添加对应映射即可,无需修改逻辑代码 - 兼容性好:完全保留dict的所有原生方法和特性,原有使用逻辑不需要做任何调整
内容的提问来源于stack exchange,提问作者Chipe
相关产品推荐
相关产品推荐

