python 关于 hasattr函数和__getattr__拓展方法的大坑

关于hasattr函数的大坑:
> 我们通常会用hasattr(obj,att)函数来检查对象obj是否有att属性, 这样可以保证obj.att的表达式不会抛出错误。
> 但实际上不是这样的,hasattr仅检查obj.att的表达式是否合法,并不保证obj一定有att属性, 因为有一个兜底的特殊方法 __getattr__()可能存在对象中,
> getattr方法在没有这个某个属性时触发, 那么就代表obj对象具有处理一切"点访问"的能力,
> 如果你的类中, 拓展了 __getattr__()机制(object没有这个方法,不能叫重写), 即便只写下pass, 同样代表了这个类能处理所有的点访问,这个时候
> 坑出现了, hasattr函数永远True..... 然后,大多数时候, __getattr__ 用得不多,也不会有什么错, 直到有一天重构代码,整合了几个类,添加了一个父类
> 然后在父类中拓展了getattr方法..
> 又因为hasattr很多时候用在一些低概率的意外判断中, 甚至即使为返回true也不会出大错, 所以并不知道哪天会爆雷。
> 如果你对hasattr一贯理解如上,又已经写下了数万行代码, 则可以在全局域中重写getattr函数,但是这样做了, 以后的你, 或者接班的程序员,对hasattr函数理解是是正确的. 会不会踩到一个更大的坑?

> 咦,  hasattr函数怎么不是蓝色?? 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值