Python如何实现自定义类以属性访问方式读写嵌套字典键值
实现方案
你可以通过自定义继承自dict的类,配合Python魔术方法实现递归的字典属性化访问,完全兼容读写需求,代码实现如下:
class AttrDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 初始化时递归转换所有嵌套字典 for k, v in self.items(): if isinstance(v, dict): self[k] = AttrDict(v) def __getattr__(self, key): try: return self[key] except KeyError: raise AttributeError(f"'AttrDict' object has no attribute '{key}'") def __setattr__(self, key, value): # 区分实例本身属性和字典键的赋值逻辑 if key in self.__dict__: super().__setattr__(key, value) else: # 赋值时自动转换嵌套字典 self[key] = AttrDict(value) if isinstance(value, dict) else value
使用示例
直接将你的字典作为参数传入AttrDict初始化即可:
myapps = AttrDict({ 'app_1': { 'username': 'admin', 'pwd': 'S3cret', 'ports': [8080, 443], 'users': {'user1': 'john', 'user2': 'ruth'} }, 'app_2': {'username': 'user1', 'pwd': 'P@ssword'} }) # 读操作测试 print("App_2 username = ", myapps.app_2.username) # 输出 App_2 username = user1 print("App_2 pwd = ", myapps.app_2.pwd) # 输出 App_2 pwd = P@ssword print("App_1 ports = ", myapps.app_1.ports) # 输出 App_1 ports = [8080, 443] print("App_1 user1 = ", myapps.app_1.users.user1) # 输出 App_1 user1 = john # 写操作测试 myapps.app_2.username = "MyNewAdminAccount" print("App_2 username = ", myapps.app_2.username) # 输出 App_2 username = MyNewAdminAccount # 新增嵌套属性测试 myapps.app_3 = {'name': 'test', 'version': '1.0'} print("App_3 name = ", myapps.app_3.name) # 输出 App_3 name = test
注意事项
该实现完全兼容原生
dict的所有操作,点号访问和中括号[]访问完全等价。如果字典键和dict内置方法/属性重名(比如items、keys等),点号访问会优先返回内置方法,这种场景请使用中括号方式访问对应键。
内容的提问来源于stack exchange,提问作者JohnnyLoo
相关产品推荐
相关产品推荐

