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

 更新时间:2026年01月19日 09:26:02   作者:大霸王龙  
这篇文章主要介绍了在Python中通过自定义类实现字典的点号取值(dict.key语法)的三种方案,并对比了它们的关键特性、适用场景和使用建议,需要的朋友可以参考下

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

相关文章

  • python 包之 Pillow 图像处理教程分享

    python 包之 Pillow 图像处理教程分享

    这篇文章主要介绍了python 包之 Pillow 图像处理教程分享,文章基于Python的相关资料展开主题相关内容,需要的小伙伴可以参考一下
    2022-04-04
  • Python 中检查一个字符是否为数字的示例代码

    Python 中检查一个字符是否为数字的示例代码

    本文详细介绍了在 Python 中检查一个字符是否为数字的几种常用方法。我们介绍了使用 isdigit() 方法、isnumeric() 方法和正则表达式等方法,并提供了示例代码帮助你理解和应用这些方法,需要的朋友可以参考下
    2023-06-06
  • PyTorch中的Subset类简介与应用示例代码

    PyTorch中的Subset类简介与应用示例代码

    在深度学习框架PyTorch中,torch.utils.data.Subset是一个非常有用的类,用于从一个较大的数据集中选择一个子集,本文将介绍Subset的概念、基本用法以及一些实际应用示例,感兴趣的朋友一起看看吧
    2024-08-08
  • 在Python的setuptools框架下生成egg的教程

    在Python的setuptools框架下生成egg的教程

    这篇文章主要介绍了在Python的setuptools框架下生成egg的教程,本文来自于IBM官方开发者技术文档,需要的朋友可以参考下
    2015-04-04
  • Python生成不重复随机值的方法

    Python生成不重复随机值的方法

    这篇文章主要介绍了Python生成不重复随机值的方法,实例分析了Python算法实现与Python自带方法的实现技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • python中的装饰器该如何使用

    python中的装饰器该如何使用

    装饰器经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。装饰器的作用就是为已经存在的对象添加额外的功能。
    2021-06-06
  • python使用PyPDF2 和 pdfplumber操作PDF文件

    python使用PyPDF2 和 pdfplumber操作PDF文件

    本文主要介绍了Python中用于操作PDF的两个库:PyPDF2和pdfplumber,下面就来具体介绍一下两个库的使用方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • python中extend功能用法举例

    python中extend功能用法举例

    这篇文章主要给大家介绍了关于python中extend功能的相关资料,Python中的extend()方法是一种非常有用的列表操作,它可以将一个列表中的元素添加到另一个列表的末尾,需要的朋友可以参考下
    2023-08-08
  • 详解Python如何通过文件后缀整理文件夹

    详解Python如何通过文件后缀整理文件夹

    这篇文章主要为大家详细介绍了Python如何通过文件后缀实现整理文件夹功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Django drf请求模块源码解析

    Django drf请求模块源码解析

    APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块,对Django drf请求模块源码相关知识感兴趣的朋友一起看看吧
    2021-06-06

最新评论