当前位置: 代码网 > it编程>前端脚本>Python > Python实现字典的点号取值的三种常用方式

Python实现字典的点号取值的三种常用方式

2026年01月19日 Python 我要评论
在 python 中实现字典的点号取值(dict.key 语法)可以通过自定义类实现。以下是三种常用实现方式,根据需求选择合适方案:方案1:简单属性访问(推荐)class dotdict(dict):

在 python 中实现字典的点号取值(dict.key 语法)可以通过自定义类实现。以下是三种常用实现方式,根据需求选择合适方案:

方案1:简单属性访问(推荐)

class dotdict(dict):
    """支持点号取值的字典类"""
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

# 使用示例
d = dotdict({"name": "alice", "age": 30, "address": {"city": "shanghai"}})

print(d.name)          # 输出: alice
print(d.address.city)  # 输出: shanghai

d.job = "engineer"     # 添加新属性
print(d.job)           # 输出: engineer

方案2:递归嵌套转换(支持多层嵌套)

class dotdict(dict):
    """支持嵌套字典的点号访问"""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for key, value in self.items():
            if isinstance(value, dict):
                self[key] = dotdict(value)
    
    def __getattr__(self, name):
        try:
            value = self[name]
            if isinstance(value, dict) and not isinstance(value, dotdict):
                return dotdict(value)
            return value
        except keyerror:
            raise attributeerror(f"'{self.__class__.__name__}' object has no attribute '{name}'")
    
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

# 使用示例
data = {
    "user": {
        "name": "bob",
        "preferences": {
            "theme": "dark",
            "notifications": true
        }
    }
}

d = dotdict(data)
print(d.user.name)                   # 输出: bob
print(d.user.preferences.theme)      # 输出: dark
d.user.preferences.font_size = 14    # 添加嵌套属性

方案3:只读访问(安全模式)

class readonlydotdict(dict):
    """只读的点号访问字典"""
    def __getattr__(self, name):
        if name in self:
            value = self[name]
            if isinstance(value, dict):
                return readonlydotdict(value)
            return value
        raise attributeerror(f"no attribute '{name}'")
    
    def __setattr__(self, name, value):
        raise typeerror("'readonlydotdict' object is read-only")

# 使用示例
config = readonlydotdict({"api": {"url": " "timeout": 30}})
print(config.api.url)  # 输出: 
config.api.port = 8080 # 抛出 typeerror

关键特性对比

特性方案1方案2方案3
点号取值
嵌套字典支持
动态添加属性
修改现有值
错误处理简单完善严格
适用场景简单配置复杂数据结构只读配置

使用建议

  1. 简单配置:选择方案1,代码简洁高效
  2. 复杂json/嵌套数据:选择方案2,自动转换嵌套字典
  3. 安全配置/常量:选择方案3,防止意外修改
  4. 兼容性:所有方案保持字典原始方法(keys(), values() 等)
  5. 错误处理:方案2/3提供明确的 attributeerror 错误信息
# 实际应用示例 - 加载配置文件
import json
from dot_dict import dotdict  # 假设保存为 dot_dict.py

with open('config.json') as f:
    config = dotdict(json.load(f))

# 点号访问配置项
print(f"api端点: {config.api.base_url}")
print(f"超时设置: {config.api.timeout}s")

到此这篇关于python实现字典的点号取值的三种常用方式的文章就介绍到这了,更多相关python字典的点号取值内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com