[Python] 通过点号来访问字典的键(Key),最优雅简洁的实现方式

自定义字典

通过点号访问字典是一个很方便的功能,然而当前网络上的实现方式大多都比较复杂,基本都是通过继承 dict 来实现的。如文章1、文章2、文章3。

直接继承 dict 类会带来一些问题,如 Custom Python Dictionaries: Inheriting From dict vs UserDict,并且使用嵌套

需要从 collections 库中继承 UserDict 而不是直接继承 dict,继承了 UserDict 的类会拥有 dict 的几乎所有功能,可以像一个字典一样使用。

一个比较优雅的实现方法如下:

from collections import UserDict

class DotDict(UserDict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.data = self._convert(dict, DotDict)

    def _convert(self, src_cls, convert_fn):
        d = {}
        for key, val in self.data.items():
            if isinstance(val, src_cls):
                d[key] = convert_fn(val)
            else:
                d[key] = val
        return d

    def __getattr__(self, item: str):
        try:
            return self.data[item]
        except KeyError:
            raise AttributeError

    def to_dict(self) -> dict:
        return self._convert(DotDict, lambda val: val.to_dict())

mydict = DotDict({'a': 1, 'b': 2, 'c': {'d': 3}})

# 这样就能通过点访问字典的key了
print(mydict.a)
print(mydict.b)
print(mydict.c.d)

转为字典

import json

json_str = json.dumps(mydict.to_dict())
posted @ 2025-04-17 00:00  昵称已违规  阅读(138)  评论(0)    收藏  举报