python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python字典的点号取值

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

作者:大霸王龙

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

您可能感兴趣的文章:
阅读全文