Python 魔法方法(七) __miss__ 无中生有的方法

博客介绍了Python字典访问键的相关知识。字典访问不存在的键会抛KeyError,可使用.get()方法避免抛错。还提到了.setdefault()可用于增加属性,同时指出利用__missing__能拦截抛错并进行多重属性赋值,不过dict需自定义该方法,访问属性时先从__getitem__获取。

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

通常,字典访问一个不存在的键时,会抛错 KeyError。

这样带来的好处是,系统通知我们访问了一个不存在的键,我们回去检查错误的原因。

但是坏处就是,程序运行中断。

想知道有没有这个key,又不想抛错中断,用的最多的就是.get()方法,若key存在,则返回对应的value,若不存在可以指定返回值,默认是None。

好了,有了.get()方法,我们就可以在抛错的边缘疯狂试探了。

 

当我们想一个人,有没有对象,没有的话再给他分配一个。这种情况下,用setdefaul()就可以了。可以直接增加一条属性。

但是我们分配的不仅仅是对象,还是个保镖!多重属性,很霸道有没有!

上例子:

class HaveGirlFriend(dict):
    def __missing__(self, key):
        print "into miss"
        if key == "girl_friend":
            self[key] = "now have girl friend"
            self["bodyguard"] = True
            return self[key]
dd = HaveGirlFriend()
print dd
# {}
print dd["boy_firend"]
# into miss
# None
print dd["girl_friend"]
# into miss
# now have girl firend
print dd
# {'girl_friend': 'now have girl friend', 'bodyguard': True}

大概就是,有个dd对象,他什么属性都没有,你不问他“有没有女朋友”,就没有女朋友,一问就,马上就有,还多多了个保镖。

当然,你问他“有没有男朋友”,他表示不搞基。

ok,总结一下

1、利用__missing__可以拦截不存在的键值抛错,还可以进行多重属性赋值。

2、dict虽然支持__missing__方法,但dict并没有实现这个方法,要自己定义这个方法。

3、访问字典属性时,先去__getitem__获取,获取不到采取__missing__(如果定义了__missing__方法,否则抛错)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值