[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())

浙公网安备 33010602011771号