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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:39:01