将字典的键变为成员变量的需求

本文探讨了Python中实现字典点语法访问的方法,包括基本的__getattr__重写及AttrDict类的创建,后者通过递归实现了多层级字典的点语法访问,提升了代码的可读性和IDE支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      公司领导写java写多了,review python代码的时候发现:“为啥你的json格式(dict)咋全部用键名来索引,这个要按照java的写法,用点来取值,这样用户使用的时候直接点点点就行,不需要自己还要去查有哪些键,你改下代码,用点来取值,兼容一下现在的格式,以后discard调python的索引方式......”

      既然是领导的要求,小的莫敢不从。于是就有了题名的需求。

      搜了下,python是动态语言,可以动态设置成员变量,但是只给个类,然后用的时候加进去,太丑陋了。调研了一会发现有几种写法:

方法一:

class mydict(dict):
    __getattr__= dict.__getitem__
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__

这是最简单的,看下结果:

发现这种写法虽然简单,但是只能索引一层字典的键,对于嵌套的字典,是无法来继续用点点点的方式取值,并且这种写法不支持IDE自动提示。

方法二:

参考Bunch包后得到的极简版:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self


    @staticmethod
    def fromDict(d):
        return AttrDict.recursion(d)

    @staticmethod
    def recursion(x):
        if isinstance(x, dict):
            return AttrDict((k, bunchify(v)) for k, v in x.items())
        else:
            return x

结果:

可以,使用递归,很好的可以一直点点点来弹出提示取值了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值