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

作者:

文章目录
  • 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
  • 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 # 添加嵌套属性
  • 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,代码简洁高效 复杂JSON/嵌套数据:选择方案2,自动转换嵌套字典 安全配置/常量:选择方案3,防止意外修改 兼容性:所有方案保持字典原始方法(keys(), values() 等) 错误处理:方案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字典的点号取值内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python字典取值全攻略之高效、简洁地获取字典值的多种技巧 python字典取值的几种方法总结 如何利用python实现列表嵌套字典取值 python接口测试返回数据为字典取值方式 python实现字典嵌套列表取值
  • 目录
    • 方案1:简单属性访问(推荐)
    • 方案2:递归嵌套转换(支持多层嵌套)
    • 方案3:只读访问(安全模式)
    • 关键特性对比
    • 使用建议

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

    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
    

    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    # 添加嵌套属性
    

    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字典的点号取值内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python字典取值全攻略之高效、简洁地获取字典值的多种技巧
    • python字典取值的几种方法总结
    • 如何利用python实现列表嵌套字典取值
    • python接口测试返回数据为字典取值方式
    • python实现字典嵌套列表取值

    站内搜索